¿Puedo obtener lo opuesto de `diff -q` - haciendo coincidir archivos idénticos sin imprimir su contenido

13

Tengo varios archivos en un directorio y quiero verificar que sean únicos. Para simplificar, digamos que tengo tres archivos: foo.txt, bar.txty baz.txt. Si ejecuto este ciclo, los comprobaré uno contra el otro:

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

Para los cientos de archivos que quiero tratar, esto se volvería bastante ilegible; sería mejor para listar los archivos que hacen partido, y luego me puede mirar por encima de la lista de forma rápida y asegurarse de que los archivos sólo son coincidentes sí mismos. Desde la página de manual, habría pensado que la -sopción lograría esto:

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

... sin embargo, de hecho, también imprime todo el contenido de los archivos que difieren. ¿Hay alguna forma de suprimir este comportamiento, por lo que solo obtengo el comportamiento anterior?

Alternativamente, ¿hay alguna otra herramienta que pueda lograr esto ?

maldad
fuente

Respuestas:

6

Si solo desea verificar si dos archivos son idénticos o no, use cmp. Para obtener una salida solo para archivos idénticos, puede usar

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

diff intenta producir una lista breve y legible de las diferencias, y esto puede llevar bastante tiempo, así que evita la sobrecarga si no la necesitas.

Uwe
fuente
12

Esto debería funcionar:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

donde dir1y dir2son tus dos directorios.

Si solo desea imprimir los directorios coincidentes desde dir1:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

Y del mismo modo, si solo desea imprimir los directorios coincidentes desde dir2:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'
j0nam1el
fuente
Esto es exactamente lo que estaba buscando, ¡gracias!
Joshua Soileau
Úselo diff -qrsal comparar archivos grandes (silencioso suprime las diferencias de impresión)
marcovtwout
4

La herramienta más rápida escrita para ese propósito es fdupes (está disponible en los repositorios de paquetes de Fedora y Ubuntu y ...)

Uso:

fdupes -r dir1 dir2
erik
fuente
2

Si necesita encontrar archivos idénticos en una lista, primero ordénelos por tamaño, por ejemplo con

ls -S

luego, para cada grupo de archivos de tamaño idéntico, ejecútelos md5sumpara ver fácilmente cuáles son idénticos.

Para archivos grandes, podría ser más rápido hacer la primera suma de verificación solo en una pequeña parte del archivo completo:

dd if=file bs=512 count=1 | md5sum

y luego realice una suma de verificación completa solo en archivos sospechosos.

enzotib
fuente