쉘에서 많은 수의 파일을 관리하는 방법은 무엇입니까?

쉘에서 많은 수의 파일을 관리하는 방법은 무엇입니까?

$ ls ./dir_with_huge_amount_of_files/errors/

디렉터리가 유닉스 타임스탬프가 있는 이미지로 가득 차 있다고 가정해 보겠습니다. 이는 수 기가바이트 이상의 단위로 측정되는 이미지가 많다는 의미입니다. 이와 같은 셸 명령은 ls수백만 개 이상의 이미지를 처리하도록 설계되지 않았기 때문에 오버플로 경고를 받게 됩니다. 그렇게 많은 수의 파일을 어떻게 관리하나요? 예를 들어 중간에 있는 사진을 찾고 싶다면(이름의 타임스탬프와 생성 시간을 기준으로) 내장된 검색 기능을 제공하는 일종의 파일 시스템이 있나요? 어떤 명령을 사용하시겠습니까? 편안 ls하고 필요한 플래그가 있는 방법을 시도했지만 find매우 느리거나 경고를 생성하므로 사진을 사전 색인화하려면 더 나은 파일 시스템이나 데이터베이스 또는 이와 유사한 것이 필요하다고 생각합니다. 기본적으로 사진의 인덱스 노드를 시간순으로 배치해야 하는 배열이 필요합니다. 어떻게 하나요? 나중에 Unix 타임스탬프가 포함된 메타데이터를 추가할 수 있습니다.

[고쳐 쓰다]

현재 답변에는 심각한 결함이 있습니다. 사람들은 경험적 테스트 없이 순위가 매겨진 답변을 게시합니다. 권장 사항을 테스트하면 실패할 수 있습니다. 그래서 저는 샌드박스를 생성하여 많은 수의 파일을 만들고 제안 사항을 테스트할 수 있는 명령줄 도구(예: 1e7개 파일 수)를 만들었습니다. 파일을 생성하는 데 시간이 오래 걸릴 수 있으므로 기다려 주시기 바랍니다. 이 작업을 수행하는 더 빠른 방법을 아는 사람이 있으면 코드를 편집하십시오. 도움을 받으려면 입력하세요 python code.py --help. 재미있게 보내세요!

다수의 디렉터리 파일을 생성하는 사용 예

$ 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

CodetestFill.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()

답변1

다른 껍질을 사용해보십시오. 나는 시도하는 것이 좋습니다다루기 힘든예를 들어 더 많은 매개변수를 허용하는지 확인하세요.

내가 올바르게 이해했다면 파일 이름의 일부는 UNIX 타임스탬프입니다. 파일을 폴더로 나누는 것이 좋습니다. 날짜/시간 형식이 UNIX epoch 숫자인 경우 숫자의 소수 부분(예: 10000)을 별도의 폴더에 넣습니다.

만약에ISO 8601타임스탬프는 파일 이름의 일부이며 단순히 연도, 월 또는 일로 나누어집니다.

답변2

locate(물론) updatedb도움이 될까요?

관련 정보