desarrollo-web-br-bd.com

¿Cuál es la forma más rápida de encontrar archivos duplicados?

Encontré este comando utilizado para encontrar archivos duplicados, pero fue bastante largo y me confundió. Por ejemplo, si elimino -printf "% s\n", no salió nada. ¿Por qué fue eso? Además, ¿por qué usaron xargs -I {} -n1? ¿Hay alguna manera más fácil de encontrar archivos duplicados?

[4a-o07-d1:root/798]#find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
0bee89b07a248e27c83fc3d5951213c1  ./test1.txt
0bee89b07a248e27c83fc3d5951213c1  ./test2.txt
30
The One

Puedes hacerlo más corto:

find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD

Do md5sum de archivos encontrados en el -exec acción de find y luego sort y haz uniq para que los archivos tengan el mismo md5sum separados por nueva línea.

45
heemayl

Puedes usar fdupes . Desde man fdupes:

Busca en la ruta dada archivos duplicados. Dichos archivos se encuentran comparando tamaños de archivo y firmas MD5, seguidos de una comparación byte por byte.

Puedes llamarlo como fdupes -r /path/to/dup/directory e imprimirá una lista de engañados.

Actualización

Puedes intentarlo con fslint también. Después de configurar fslint, vaya a cd /usr/share/fslint/fslint && ./fslint /path/to/directory

39
Rahul

En caso de que quieras entender el comando original, veamos eso paso a paso.

find -not -empty -type f

Encuentra todos los archivos no vacíos en el directorio actual o en cualquiera de sus subdirectorios.

   -printf "%s\n"

Imprime su tamaño. Si suelta estos argumentos, imprimirá rutas en su lugar, rompiendo los pasos posteriores.

 | sort -rn

Ordenar numéricamente (-n), en orden inverso (-r). Sin embargo, ordenar en orden ascendente y comparar como cadenas y no números debería funcionar igual de bien, por lo que puede eliminar el -rn banderas.

 | uniq -d

Busque filas duplicadas consecutivas y conserve solo esas.

 | xargs -I{} -n1

Para cada línea de entrada (es decir, cada tamaño que ocurre más de una vez), ejecute el siguiente comando, pero reemplace {} por el tamaño. Ejecute el comando una vez para cada línea de entrada, en lugar de pasar múltiples entradas a una sola invocación.

   find -type f -size {}c -print0

Este es el comando que se debe ejecutar para cada tamaño: busque archivos en el directorio actual que coincidan con ese tamaño, dados en caracteres (c) o más precisamente bytes. Imprima todos los nombres de archivo coincidentes, separados por bytes nulos en lugar de nuevas líneas para que los nombres de archivo que contienen nuevas líneas se traten correctamente.

 | xargs -0 md5sum

Para cada uno de estos nombres separados por nulos, calcule la suma de comprobación MD5 de dicho archivo. Esta vez permitimos pasar múltiples archivos a una sola invocación de md5sum.

 | sort

Ordenar por sumas de verificación, ya que uniq solo considera líneas consecutivas.

 | uniq -w32 --all-repeated=separate

Busque líneas que coincidan en sus primeros 32 bytes (la suma de verificación; después de eso viene el nombre del archivo). Imprima todos los miembros de tales ejecuciones de duplicados, con distintas ejecuciones separadas por nuevas líneas.

En comparación con el comando más simple sugerido por heemayl , esto tiene la ventaja de que solo incluirá archivos de suma de comprobación que tengan otro archivo del mismo tamaño. Paga eso con invocaciones repetidas find, atravesando así el árbol de directorios varias veces. Por esas razones, este comando es particularmente adecuado para directorios con pocos pero grandes archivos, ya que en esos casos evitar una llamada de suma de comprobación puede ser más importante que evitar el recorrido repetido del árbol.

15
MvG