¿Cómo encontrar los archivos más comunes o frecuentes en el directorio?

¿Cómo encontrar los archivos más comunes o frecuentes en el directorio?

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 findpara 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

información relacionada