Tengo varios archivos en un directorio y quiero verificar que sean únicos. Para simplificar, digamos que tengo tres archivos: foo.txt
, bar.txt
y 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 -s
opció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 ?
diff -qrs
al comparar archivos grandes (silencioso suprime las diferencias de impresión)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:
fuente
Si necesita encontrar archivos idénticos en una lista, primero ordénelos por tamaño, por ejemplo con
luego, para cada grupo de archivos de tamaño idéntico, ejecútelos
md5sum
para 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:
y luego realice una suma de verificación completa solo en archivos sospechosos.
fuente