Tengo un directorio con muchas imágenes (más de 100.000). Muchas de ellas son duplicados/imágenes idénticas, pero obviamente todas tienen nombres de archivo diferentes. Necesito encontrar las imágenes que tienen más duplicados en este directorio. Por ejemplo, file1.jpeg tiene 120 duplicados, file2.jpeg tiene 90 duplicados, etc.
Estaba pensando en obtener el md5 de cada archivo y hacer algún tipo de búsqueda, pero no entiendo los detalles. ¿Se puede hacer esto con un script de shell?
Para ser claros, no necesito eliminar duplicados (todavía), necesito encontrar qué archivos tienen más copias.
Estoy en OS X si eso ayuda.
Respuesta1
Si los archivos son duplicados exactos, es probable que sea útil posprocesar el resultado shasum * | sort
. Guárdelo en un archivo ya que el cálculo puede tardar un poco y es probable que lo necesite más de una vez:
shasum * | sort >/tmp/shasums
Por ejemplo, para ver la distribución de archivos idénticos (solo con sumas de verificación, no con nombres de archivos):
</tmp/shasums cut -d ' ' -f 1 | uniq -c
A continuación se muestra una forma de ver tanto los nombres de los archivos como los recuentos de duplicados:
</tmp/shasums sed 's/ .*//' | uniq -c - | join -1 2 - /tmp/shasums | sort -k 2,1
Sin GNU uniq, no tengo nada mejor que ofrecer para mostrar los nombres de los archivos de una manera agradable que el siguiente script Perl:
</tmp/shasums perl -lne '
s/^([^ ]*?) //; # set $1 to the checksum and $2 to the filename
push @{$names{$1}}, $_; # dispatch file names by checksum
END {
# iterate through the checksums, sorted by repeat count
foreach (sort {@$a <=> @$b} values %names) {
# print the repeat count and the file names
printf "%d %s\n", scalar(@$_), join(" ", @$_)
}
}'
Respuesta2
Esta es una canalización rápida y sucia que imprimirá nombres de duplicados entre líneas de guiones. Solo busca en el directorio actual, pero podrías usarlo find
para hacer una búsqueda recursiva.
md5sum *.jpeg | sort | awk '{if ($1 != prev) print "-----"; print $2; prev = $1}'
Salida de ejemplo:
-----
unique1.jpeg
-----
dup1.jpeg
dup2.jpeg
dup3.jpeg
-----
same1.jpeg
same2.jpeg
-----
solo1.jpeg