Tengo una carpeta que contiene muchas carpetas que contienen muchos archivos. Miles.
Puedo hacer find . -type f > ./FILE-LISTING.TXT
para crear un archivo que contenga muchos miles de rutas de archivo que se vea así:
./Anders/Letters/20190101 Rent.pdf
./Anders/Letters/20190103 Appeal.pdf
./Anders/Letters/20190107 Decision.pdf
./Beeker/Letters/20180101 Rent.pdf
¿Cómo alimentaría esa lista de rutas de archivo md5
para producir una salida con el formato siguiente?
9cf14e4d666dcb6aab17763b02429a19 ./Anders/Letters/20190101 Rent.pdf
d1bb70baa31f1df69628c00632b65eab ./Anders/Letters/20190103 Appeal.pdf
7a0f5bc18688fe8ba32f43aa6ec53fb1 ./Anders/Letters/20190107 Decision.pdf
a0c96a79cf3b1847025d9f073151519d ./Beeker/Letters/20180101 Rent.pdf
NB: quiero los hash md5 de los archivos a los que se hace referencia, no el md5 de la lista de archivos, ni los hash md5 de las cadenas en el file-listing.txt.
Además, ¿sería más rápido hacerlo todo en una línea de comando, o hacerlo en dos pasos ( find
para crear file-listing.txt, luego md5
para crear file-listing-md5.txt)?
find . -type f -exec /sbin/md5 -r {} +
^^^^^^^ ^^^^^ ^^^^^^^^^^^^ ^^ ^
| | | | |
| | | | +- add as many file names as possible per call
| | | +---- replace with names of found files
| | +------------ command to run
| +--------------------- execute following command
+---------------------------- find any "normal" file
debería hacer el truco (y ocuparse de los problemas habituales con espacios, etc. dentro de los nombres de archivo).
En cuanto a más rápido: un pase casi siempre es más rápido que dos pases. En el caso específico, el cálculo de MD5 toma tanto tiempo que probablemente se puedan ignorar otros factores.
PD: Punta del sombrero a @lhf por recordarme-r
time
. La find -exec
versión era unos 3 segundos más rápida que find | xargs
. Sin embargo, el tiempo de ejecución para ambos fue de alrededor de 45 segundos, lo que significa que (a) la diferencia es inferior al 10 % y (b) el tiempo probablemente esté limitado por E/S (imprimiendo en la consola).Prueba esto:
find . -type f -print0 | xargs -0 md5 -r
Tenga en cuenta -print0
y -0
para manejar los espacios en los nombres de archivo.
En comparación con find . -type f -exec
, esta solución se ejecuta md5
con mucha menos frecuencia, aunque es posible que esto no tenga un impacto medible.
find
's -exec {}
también puede manejar espacios en los nombres de archivo.time
. La find -exec
versión era unos 3 segundos más rápida que find | xargs
. Sin embargo, el tiempo de ejecución para ambos fue de alrededor de 45 segundos, lo que significa que (a) la diferencia es inferior al 10 % y (b) el tiempo probablemente esté limitado por E/S (imprimiendo en la consola).
bmike
jim l
mtree
es una herramienta ya disponible para monitorear hashes de archivos y detectar cambios en nombres de archivos, contenidos de archivos, permisos o marcas de fecha.man mtree
para detalles.mtree -c -K md5digest
eric