[unix] 쉘에서 대량의 파일을 관리하는 방법?

$ ls ./dir_with_huge_amount_of_files/errors/

디렉토리에 유닉스 타임 스탬프가있는 그림으로 가득 차 있다고 가정하면 많은 GB 또는 그 이상으로 측정 된 것을 의미합니다. 셸 명령 ls은 수백만 (또는 그 이상)의 그림으로 작동하도록 설계되지 않았기 때문에 오버플로 스타일 경고를받습니다. 그렇게 많은 양의 파일을 어떻게 관리 할 수 ​​있습니까? 예를 들어, 이름과 생성 시간의 타임 스탬프에 따라 중간에 사진을 찾으려면 내장 검색 기능을 제공하는 파일 시스템이 있습니까? 어떤 명령을 사용 하시겠습니까? 나는 편안 ls하고find필요한 플래그가 있지만 매우 느리거나 경고가 발생했기 때문에 그림을 사전 인덱싱하려면 더 나은 파일 시스템이나 db 또는 이와 유사한 것이 필요하다고 생각합니다. 기본적으로 사진의 inode를 시간 순서대로 배치 해야하는 하나의 배열이 필요합니다. 그렇게하는 방법? 나중에 유닉스 타임 스탬프가있는 메타 데이터를 추가 할 수 있습니다.

[최신 정보]

현재 답변에는 심각한 결함이 있습니다. 사람들은 경험적 테스트없이 일종의 답변을 게시합니다. 그들이 제안을 테스트했다면 실패했을 것입니다. 따라서 샌드 박스를 만들어 엄청난 양의 파일을 만들고 1e7 양의 파일과 같은 제안을 테스트 할 수있는 명령 줄 도구를 만들었습니다. 파일을 생성하는 데 시간이 오래 걸리므로 인내심을 가지십시오. 누군가가 더 빠른 방법을 알고 있다면 코드를 편집하십시오. 유형python code.py --help도움말을 보려면 하십시오. 즐기세요!

많은 dirred 파일을 생성하는 사용 예

$ ls ./data2
ls: ./data2: No such file or directory
$ python testFill.py -n 3 -d 7
$ tree data2/
data2/
|-- 0
|   |-- 1302407302636973
|   |-- 1302407302638022
|   `-- 1302407302638829
|-- 1
|   |-- 1302407302639604
|   |-- 1302407302641652
|   `-- 1302407302642399
|-- 2
|   |-- 1302407302643158
|   |-- 1302407302645223
|   `-- 1302407302646026
|-- 3
|   |-- 1302407302646837
|   |-- 1302407302649110
|   `-- 1302407302649944
|-- 4
|   |-- 1302407302650771
|   |-- 1302407302652921
|   `-- 1302407302653685
|-- 5
|   |-- 1302407302654423
|   |-- 1302407302656352
|   `-- 1302407302656992
`-- 6
    |-- 1302407302657652
    |-- 1302407302659543
    `-- 1302407302660156

7 directories, 21 files

코드 testFill.py

# Author: hhh
# License: ISC license

import os, math, time, optparse, sys

def createHugeAmountOfFiles(fileAmount, dirAmount):
   counter = 0
   DENSITY = 1e7
   dir = "./data/"

   do = dir+str(counter)+"/"
   while (os.path.exists(do)):
      counter = counter+1
      do = dir+str(counter)+"/"

   os.mkdir(do)

   for d in range(int(dirAmount)):
      for f in range(int(fileAmount)):
         timeIt = int(time.time()*1e6)
         if (not os.path.exists(do)):
            os.mkdir(do)

         if (timeIt % DENSITY == 0):
            counter = counter+1
            do = dir+str(counter)+"/"

            if (not os.path.exists(do)):
               os.mkdir(do)


         do = dir+str(counter)+"/"
         if(not os.path.exists(do)):
            os.mkdir(do)

         f = open(do+str(timeIt), 'w')
         f.write("Automatically created file to test Huge amount of files.")
         f.close()
      counter = counter +1


def ls(dir):
   for root, dirs, files in os.walk("./data/"+dir):
      print(files)

def rm(dir):
   for root, dirs, files in os.walk("./data/"+dir):
      for f in files:
         os.remove("./data/"+dir+"/"+f)


def parseCli():
   parser = optparse.OptionParser()
   parser.add_option("-f", "--file", dest="filename",
                     help="Location to remove files only in ./Data.", metavar="FILE")
   parser.add_option("-n", "--number", dest="number",
                     help="Number of files to generate", metavar="NUMBER")
   parser.add_option("-r", "--remove", dest="remove",
                     help="Data -dir content to remove", metavar="NUMBER")
   parser.add_option("-d", "--dir", dest="dir",
                     help="Amount of dirs to generate", metavar="NUMBER")
   parser.add_option("-q", "--quiet",
                     action="store_false", dest="verbose", default=True,
                     help="don't print status messages to stdout")

   return parser.parse_args()

def main():
   (options, args) = parseCli()

   if (options.filename):
      ls(options.filename)
   if (options.number and options.dir):
      createHugeAmountOfFiles(options.number, options.dir)
   if (options.remove):
      rm(options.remove)


main()



답변

다른 껍질을 사용해보십시오. 예를 들어 zsh 를 사용하고 더 많은 매개 변수를 허용하는지 확인하는 것이 좋습니다 .

올바르게 이해하면 파일 이름의 일부가 UNIX 타임 스탬프입니다. 파일을 폴더로 나누는 것이 좋습니다. 날짜 / 시간 형식이 UNIX 에포크 (epoch) 번호 인 경우 해당 폴더의 소수 (예 : 10000)를 별도의 폴더에 넣으십시오.

ISO 8601 타임 스탬프가 파일 이름의 일부인 경우 연도, 월 또는 일로 간단히 나눕니다.


답변

것이다 locate(물론 updatedb) 당신에게 어떤 도움이 될?


답변