
Tengo una carpeta con miles (70G folder/to/check/
) de imágenes y, para cada archivo, quiero verificar si ya existe en otro directorio con miles de miles de imágenes (414G folder/to/search/
).
Este es el script que se me ocurrió, pero tarda mucho en ejecutarse, así que creo que la tarea podría optimizarse.
find folder/to/check/ -type f -exec md5sum {} + | awk -F" " '{ print $1,$2 }' | while read -r p1 p2; do find folder/to/search/ -type f -exec md5sum {} + | grep "^$p1" && echo "Found: $p1 $p2" || echo "Not found: $p1 $p2"; done > out.txt
¿Alguien tiene una idea o podría indicarme la dirección correcta para optimizar el script? Aunque mis habilidades son muy básicas.
Respuesta1
Hacer esto.
Calcule la suma md5 de cada imagen en la carpeta "para verificar", escríbala en un archivo de texto.
Calcule la suma md5 de cada imagen en la carpeta "para buscar", agréguela al primer archivo.
Ordene este archivo gigante en un archivo nuevo.
Utilice algo como
uniq -c
para contar el número de veces que se duplica cada línea.
Si entendí bien tu comando (puede que no), creo que ahora estás ejecutando md5sum
un total de X * Y veces, pero con lo anterior, eso se reduce a X + Y veces.
Respuesta2
mtree
es una utilidad útil siempre que necesite comparar dos jerarquías de archivos en busca de marcas de tiempo iguales/diferentes o hashes MD5/SHA256 iguales/diferentes.
Configuremos una jerarquía de prueba simple:
$ mkdir -p folder/to/check
$ mkdir -p folder/to/search
$ for N in $(jot -w %03d 10); do touch `/image-$N.jpg; done
$ for N in $(jot -w %03d 10 2); do touch folder/to/search/image-$N.jpg; done
folder/to/check
tiene archivos image-001
a través -010
, mientras que folder/to/search
tiene image-002
a través -011
. Todos los archivos son idénticos (cero bytes de longitud), pero tienen marcas de tiempo diferentes.
Si ustedsoloSi desea verificar el hash MD5 (y la presencia/ausencia de cada archivo), entonces:
$ mtree -kmd5 -cp folder/to/check | mtree -p folder/to/search
extra: image-011.jpg
./image-001.jpg missing
La extra
línea dice que image-011.jpg
estaba presente folder/to/search
pero no era necesario que estuviera (ya que no está en folder/to/check
), y la missing
línea dice que image-001.jpg
se encontró en la carpeta de origen ( folder/to/check
) pero no en la carpeta de destino ( folder/to/search
).
Si desea verificar la marca de tiempo además del hash MD5, entonces:
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
Ese resultado todavía muestra las mismas líneas extra
y missing
, además de una cantidad de archivos que son idénticos en el hash MD5, pero que tienen marcas de tiempo diferentes. Finalmente, si alguno de los archivos tiene un hash MD5 diferente al de su homólogo, mtree
te indicará cuáles:
$ date > folder/to/search/image-007.jpg
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
size (0, 29)
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:25:05 2019)
md5digest (0xd41d8cd98f00b204e9800998ecf8427e, 0x6fd624d18a8fe0c096b19ff858a2acf7)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
Respuesta3
Existen utilidades para hacer esto, pero si desea hacerlo usted mismo:
- Obtenga el tamaño en bytes de todos los archivos y haga listas de todos los archivos que tengan exactamente el mismo tamaño.
- Para listas que tienen más de un elemento (no tantos, especialmente entre archivos grandes):
- calcular el MD5 de todos los elementos de la lista
- comprobar si hay duplicados
En esencia, esto te hace calcular el hash MD5.una vezy sólo para archivos que no puedas discriminar por tamaño.
Por supuesto, esto supone que no tiene duplicados entre los archivos existentes o entre los archivos nuevos (pero también se puede modificar fácilmente para verificar esto).