$ 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
답변2
locate
(물론) updatedb
도움이 될까요?