Ten en cuenta que en la informática un problema casi siempre tiene más de una resoluciones, no obstante nosotros mostramos lo más óptimo y eficiente.
Solución:
Puedes usar el diff
comando tal como lo usaría para archivos:
diff
Si desea ver subcarpetas y archivos también, puede usar el -r
opción:
diff -r
Una buena manera de hacer esta comparación es usar find
con md5sum
Entonces un diff
.
Ejemplo
Use buscar para enumerar todos los archivos en el directorio, luego calcule el hash md5 para cada archivo y canalícelo ordenado por nombre de archivo a un archivo:
find /dir1/ -type f -exec md5sum + | sort -k 2 > dir1.txt
Haga el mismo procedimiento para el otro directorio:
find /dir2/ -type f -exec md5sum + | sort -k 2 > dir2.txt
Luego compare el resultado de dos archivos con 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 quieres ver solo 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á 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 necesita asegurarse de que los archivos sean iguales en ambos directorios.
Otra buena manera de hacer el trabajo es usando Git's diff
comando (puede causar problemas cuando los archivos tienen diferentes permisos -> todos los archivos se enumeran en la salida entonces):
git diff --no-index dir1/ dir2/
Si no está usando bash, puede hacerlo usando diff con --brief
y --recursive
:
$ diff -rq dir1 dir2
Only in dir2: file2
Only in dir1: file1
Él man diff
incluye ambas opciones:
-q
,--brief
informar solo cuando los archivos difieren
-r
,--recursive
comparar recursivamente cualquier subdirectorio encontrado
Si posees alguna vacilación o forma de desarrollar nuestro escrito eres capaz de realizar una crítica y con mucho gusto lo ojearemos.