$ ls ./dir_with_huge_amount_of_files/errors/
Angenommen, ein Verzeichnis ist voller Bilder mit Unix-Zeitstempeln. Ich meine viel gemessen in vielen GB oder sogar mehr. Shell-Befehle wie ls
erhalten Warnungen im Überlaufstil, da sie nicht für die Arbeit mit Millionen (oder mehr) Bildern ausgelegt sind. Wie kann ich so viele Dateien verwalten? Wenn ich zum Beispiel das Bild in der Mitte finden möchte (entsprechend dem Zeitstempel im Namen und der Erstellungszeit), gibt es ein Dateisystem, das eine integrierte Suchfunktion bietet? Welche Befehle würden Sie verwenden? Ich versuchte es bequem ls
undfind
mit den notwendigen Flags, aber sie waren entweder sehr langsam oder erzeugten Warnungen, also denke ich, dass ich entweder ein besseres Dateisystem oder eine bessere Datenbank oder ähnliches brauche, um die Bilder vorab zu indizieren. Ich brauche grundsätzlich ein Array, auf dem die Inodes der Fotos in chronologischer Reihenfolge angeordnet werden sollen. Wie geht das? Später könnten Metadaten mit Unix-Zeitstempeln hinzugefügt werden.
[Aktualisieren]
Die aktuellen Antworten weisen einen schwerwiegenden Fehler auf. Die Leute veröffentlichen nur Antworten ohne empirische Tests. Wenn sie ihre Vorschläge getestet hätten, würden sie wahrscheinlich scheitern. Daher habe ich Ihnen ein Befehlszeilentool erstellt, mit dem Sie die Sandbox erstellen können, um die große Anzahl von Dateien zu erstellen und Ihre Vorschläge wie mit 1e7 Dateien zu testen. Das Generieren der Dateien kann lange dauern. Seien Sie also geduldig. Wenn jemand einen schnelleren Weg kennt, bearbeiten Sie bitte den Code. Geben Sie ein python code.py --help
, um die Hilfe zu erhalten. Habe Spaß!
Anwendungsbeispiel zum Erstellen vieler dirred-Dateien
$ 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
Code 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()
a/b/abcdef.jpg