$ ls ./dir_with_huge_amount_of_files/errors/
Supongamos que un directorio está lleno de imágenes con marcas de tiempo Unix, quiero decir, mucho medido en muchos GB o incluso más. Los comandos de shell como ls
recibirán advertencias de estilo de desbordamiento porque no están diseñados para funcionar con millones (o más) de imágenes. ¿Cómo puedo administrar una cantidad tan grande de archivos? Si, por ejemplo, quiero encontrar la imagen en el medio (de acuerdo con la marca de tiempo en el nombre y la hora de creación), ¿hay algún sistema de archivos que ofrezca una función de búsqueda integrada? ¿Qué comandos usarías? Probé el cómodo ls
yfind
con los indicadores necesarios, pero eran muy lentos o generaban advertencias, por lo que creo que necesito un mejor sistema de archivos o db o algo así para indexar previamente las imágenes. Básicamente necesito una matriz en la que los inodes de las fotos se coloquen en orden cronológico. ¿Como hacer eso? Más tarde, se podrían agregar metadatos con marcas de tiempo unix.
[Actualizar]
Hay una falla grave en las respuestas actuales, la gente simplemente publica un tipo de respuestas sin pruebas empíricas. Si hubieran probado sus sugerencias, probablemente fracasarían. Por lo tanto, te creé una herramienta de línea de comandos mediante la cual puedes crear el sandbox para crear la gran cantidad de archivos y probar tus sugerencias como con 1e7 cantidad de archivos. Generar los archivos puede llevar mucho tiempo, así que tenga paciencia. Si alguien conoce una forma más rápida de hacerlo, edite el código. Escriba python code.py --help
para obtener la ayuda. ¡Que te diviertas!
Ejemplo de uso para crear muchos archivos dirigidos
$ 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
Código 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