Saltar al contenido

Comparando el contenido de dos directorios

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 md5sumEntonces 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *