$ ls ./dir_with_huge_amount_of_files/errors/
Supposons qu'un répertoire soit plein d'images avec des horodatages Unix, je veux dire beaucoup mesuré en plusieurs Go ou même plus. Les commandes shell comme celles- ls
ci recevront des avertissements de type débordement car elles ne sont pas conçues pour fonctionner avec des millions (ou plus) d'images. Comment gérer une telle quantité de fichiers? Si, par exemple, je veux trouver l'image au milieu (en fonction de l'horodatage du nom et de l'heure de création), y a-t-il un système de fichiers qui offre une fonction de recherche intégrée? Quelles commandes utiliseriez-vous? J'ai essayé le confortable ls
etfind
avec les drapeaux nécessaires mais ils étaient soit très lents, soit des avertissements générés, donc je pense que j'ai besoin d'un meilleur système de fichiers ou d'une base de données ou quelque chose comme ça pour pré-indexer les images. J'ai essentiellement besoin d'un tableau dans lequel les inodes des photos doivent être placés dans l'ordre chronologique. Comment faire ça? Plus tard, des métadonnées avec des horodatages Unix pourraient être ajoutées.
[Mise à jour]
Il y a une faille sérieuse dans les réponses actuelles, les gens ne font que poster des sortes de réponses sans tests empiriques. S'ils avaient testé leurs suggestions, ils échoueraient probablement. Par conséquent, je vous ai créé un outil en ligne de commande par lequel vous pouvez créer le bac à sable pour créer une énorme quantité de fichiers et tester vos suggestions comme avec une quantité de 1e7 de fichiers. La génération des fichiers peut prendre beaucoup de temps, alors soyez patient. Si quelqu'un sait comment le faire plus rapidement, veuillez modifier le code. Tapez python code.py --help
pour obtenir de l'aide. S'amuser!
Exemple d'utilisation pour créer un grand nombre de fichiers 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
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()
la source
a/b/abcdef.jpg
Réponses:
Essayez un autre shell. Je recommanderais d'essayer zsh par exemple, et voir s'il autorise plus de paramètres.
Si je comprends bien, une partie du nom de fichier est un horodatage UNIX. Il peut être conseillé de diviser les fichiers en dossiers. Si le format de date / heure est un nombre d'époque UNIX, placez des morceaux de fractions de ce nombre, disons 10000, dans un dossier séparé.
Si un horodatage ISO 8601 fait partie du nom de fichier, divisez simplement par année, mois ou jour.
la source
"$ 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 "
. Désolé mais je ne vois pas comment cela est lié à la question -1 car il était si facile de tester cela, de créer uniquement des fichiers 1e6 et d'exécuter les commandes.Serait
locate
(et bien sûrupdatedb
) d'une quelconque aide?la source
updatedb
utilisefind
.