Una buena manera de hacer esta comparación es usar find
con md5sum
, luego a diff
.
Ejemplo
Use find para enumerar todos los archivos en el directorio, luego calcule el hash md5 para cada archivo y canalícelo por nombre de archivo a un archivo:
find /dir1/ -type f -exec md5sum {} + | sort -k 2 > dir1.txt
Realice el mismo procedimiento para el otro directorio:
find /dir2/ -type f -exec md5sum {} + | sort -k 2 > dir2.txt
Luego compare el resultado con dos archivos diff
:
diff -u dir1.txt dir2.txt
O como un solo comando usando la sustitución de procesos:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2) <(find /dir2/ -type f -exec md5sum {} + | sort -k 2)
Si solo quieres ver los cambios:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ") <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ")
El comando de corte imprime solo el hash (primer campo) para ser comparado por diff. De lo contrario, diff imprimirá cada línea, ya que las rutas del directorio difieren incluso cuando el hash es el mismo.
Pero no sabrás qué archivo cambió ...
Para eso, puedes probar algo como
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /') <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /')
Esta estrategia es muy útil cuando los dos directorios a comparar no están en la misma máquina y debe asegurarse de que los archivos sean iguales en ambos directorios.
Otra buena manera de hacer el trabajo es usar el diff
comando de Git (puede causar problemas cuando los archivos tienen permisos diferentes -> cada archivo aparece en la salida):
git diff --no-index dir1/ dir2/
bash --version
?