$ ls ./dir_with_huge_amount_of_files/errors/
Załóżmy, że katalog jest pełen zdjęć z uniksowymi znacznikami czasu, mam na myśli wiele mierzonych w wielu GB lub nawet więcej. Takie polecenia powłoki ls
otrzymają ostrzeżenia w stylu przepełnienia, ponieważ nie są zaprojektowane do pracy z milionami (lub więcej) zdjęć. Jak mogę zarządzać tak dużą ilością plików? Jeśli na przykład chcę znaleźć obraz na środku (zgodnie ze znacznikiem czasu w nazwie i czasie utworzenia), czy istnieje jakiś system plików, który oferuje wbudowaną funkcję wyszukiwania? Jakich poleceń byś użył? Próbowałem wygodne ls
ifind
z niezbędnymi flagami, ale były albo bardzo powolne, albo generowały ostrzeżenia, więc myślę, że potrzebuję lepszego systemu plików lub db albo czegoś takiego, aby wstępnie zindeksować zdjęcia. Zasadniczo potrzebuję jednej tablicy, do której powinny być umieszczone inody zdjęć w kolejności chronologicznej. Jak to zrobić? Później można dodać metadane z uniksowymi znacznikami czasu.
[Aktualizacja]
W obecnych odpowiedziach występuje poważna wada, ludzie po prostu publikują rodzaj odpowiedzi bez testów empirycznych. Gdyby przetestowali swoje sugestie, prawdopodobnie by się nie powiedzieli. Dlatego stworzyłem ci narzędzie wiersza polecenia, za pomocą którego możesz utworzyć piaskownicę, aby utworzyć ogromną liczbę plików i przetestować swoje sugestie, tak jak w przypadku liczby plików 1e7. Wygenerowanie plików może zająć dużo czasu, więc bądź cierpliwy. Jeśli ktoś wie, jak to zrobić szybciej, edytuj kod. Wpisz, python code.py --help
aby uzyskać pomoc. Baw się dobrze!
Przykład użycia do tworzenia wielu plików 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
Kod 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()
źródło
a/b/abcdef.jpg
Odpowiedzi:
Wypróbuj inną powłokę. Polecam na przykład wypróbowanie zsh i sprawdź, czy pozwala to na więcej parametrów.
Jeśli dobrze rozumiem, część nazwy pliku jest znacznikiem czasu UNIX. Wskazane może być podzielenie plików na foldery. Jeśli format daty / godziny jest liczbą z epoki UNIX, umieść fragmenty tej liczby, powiedzmy 10000, w osobnym folderze.
Jeśli znacznik czasu ISO 8601 jest częścią nazwy pliku, po prostu podziel go według roku, miesiąca lub dnia.
źródło
"$ cp * Test/ ksh: cp: Argument list too long % rm * zsh: sure you want to delete all the files in /home/user/Downloads [yn]? y zsh: argument list too long: rm % ls * zsh: argument list too long: ls "
. Przepraszam, ale nie widzę, jak to się ma do pytania -1, ponieważ tak łatwo było to przetestować, utworzyć tylko pliki 1e6 i uruchomić polecenia.Czy
locate
(i oczywiścieupdatedb
) byłby dla ciebie pomocny?źródło
updatedb
wykorzystujefind
.