$ ls ./dir_with_huge_amount_of_files/errors/
Supponiamo che una directory sia piena di immagini con timestamp unix, intendo molto misurato in molti GB o anche di più. I comandi shell come ls
riceveranno avvisi in stile overflow perché non sono progettati per funzionare con milioni (o più) di immagini. Come posso gestire una così grande quantità di file? Se, ad esempio, voglio trovare l'immagine nel mezzo (in base al timestamp nel nome e nel tempo di creazione), esiste un file system che offre una funzione di ricerca integrata? Quali comandi useresti? Ho provato il comodo ls
efind
con i flag necessari ma sono stati molto lenti o hanno generato avvisi, quindi sto pensando che ho bisogno di un file system migliore o di un db o qualcosa del genere per preindicizzare le immagini. Fondamentalmente ho bisogno di un array in cui gli inode delle foto dovrebbero essere posizionati in ordine cronologico. Come farlo? Successivamente, potrebbero essere aggiunti metadati con unix-timestamps.
[Aggiornare]
C'è un grave difetto nelle risposte attuali, le persone inviano solo una sorta di risposte senza test empirici. Se avessero testato i loro suggerimenti, probabilmente avrebbero fallito. Quindi, ti ho creato uno strumento da riga di comando con il quale puoi creare il sandbox per creare l'enorme quantità di file e testare i tuoi suggerimenti come con 1e7 quantità di file. La generazione dei file può richiedere molto tempo, quindi sii paziente. Se qualcuno conosce un modo più rapido per farlo, modifica il codice. Digita python code.py --help
per ottenere aiuto. Divertiti!
Esempio di utilizzo per creare molti file diretti
$ 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
Codice 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