Tengo dos directorios que deben contener los mismos archivos y tener la misma estructura de directorios.
Creo que falta algo en uno de estos directorios.
Usando el shell bash, ¿hay alguna forma de comparar mis directorios y ver si a uno de ellos le faltan archivos que están presentes en el otro?
command-line
AndreaNobili
fuente
fuente
bash --version
?Respuestas:
Una buena manera de hacer esta comparación es usar
find
conmd5sum
, luego adiff
.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:
Realice el mismo procedimiento para el otro directorio:
Luego compare el resultado con dos archivos
diff
:O como un solo comando usando la sustitución de procesos:
Si solo quieres ver los cambios:
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
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):fuente
find
se enumerarán los archivos diferirá en general entre los dos directorios.Puede usar el
diff
comando tal como lo usaría para los archivos:Si desea ver subcarpetas y archivos también, puede usar la
-r
opción:fuente
diff
funciona para directorios (man diff lo confirmó), pero esto no verifica recursivamente los cambios en los subdirectorios dentro de los subdirectorios.a/b/c/d/a
,x/b/c/d/b
. Mira lodiff a x
que te da.-r
opción. Eso (diff -r a x
) me da:Only in a/b/c/d: a. only in x/b/c/d: b.
Si no está utilizando bash, puede hacerlo utilizando diff con
--brief
y--recursive
:La
man diff
incluye las dos opciones:fuente
Aquí hay una alternativa, para comparar solo nombres de archivos, y no sus contenidos:
Esta es una manera fácil de enumerar los archivos que faltan, pero, por supuesto , ¡no detectará archivos con el mismo nombre pero con contenidos diferentes!
(Personalmente uso mi propio
diffdirs
script, pero eso es parte de una biblioteca más grande ).fuente
diff
no admite a partir de ahora. Pero hay algocomm
que lo admite desde git.savannah.gnu.org/cgit/coreutils.git/commit/…, así que una vez que se trata de un núcleoutils cerca de usted, puede hacerlocomm -z <(cd folder1 && find -print0 | sort) <(cd folder2 && find -print0 | sort -z)
(cuya salida puede tener que convertir aún más en el formato necesita usar el--output-delimiter
parámetro y las herramientas adicionales).Tal vez una opción es ejecutar rsync dos veces:
Con la línea anterior, obtendrá los archivos que están en dir1 y son diferentes (o que faltan) en dir2.
Lo mismo para dir2
Puede eliminar la
-n
opción de someterse a los cambios. Eso es copiar la lista de archivos a la segunda carpeta.En caso de que lo haga, tal vez sea una buena opción usar
-u
, para evitar sobrescribir archivos más nuevos.Una frase:
fuente
Si desea hacer que cada archivo sea expandible y contraíble, puede canalizar la salida
diff -r
a Vim.Primero demos a Vim una regla de plegado:
Ahora sólo:
Puede golpear
zo
yzc
abrir y cerrar pliegues. Para salir de Vim, presiona:q<Enter>
fuente
Tarea bastante fácil de lograr en python:
Sustituya los valores reales por
DIR1
yDIR2
.Aquí hay una muestra de ejecución:
Para facilitar la lectura, aquí hay un script real en lugar de una línea:
fuente
os.listdir
no da ningún orden específico. Por lo tanto, las listas pueden tener las mismas cosas en un orden diferente y la comparación podría fallar.Inspirado por la respuesta de Sergiy, escribí mi propio script de Python para comparar dos directorios.
A diferencia de muchas otras soluciones, no compara el contenido de los archivos. Además, no va dentro de subdirectorios que faltan en uno de los directorios. Por lo tanto, el resultado es bastante conciso y el script funciona rápido con directorios grandes.
Si lo guarda en un archivo llamado
compare_dirs.py
, puede ejecutarlo con Python3.x:Salida de muestra:
PD: si necesita comparar tamaños de archivos y hashes de archivos para posibles cambios, publiqué un script actualizado aquí: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
fuente
cmpdirs dir1 dir2 '/\.git/'
Agregaré a esta lista una alternativa de NodeJs que escribí hace algún tiempo.
dir-compare
fuente
Me gustaría sugerir una gran herramienta que acabo de descubrir: MELD .
Funciona correctamente y todo lo que puede hacer con el comando
diff
en un sistema basado en Linux, ¡puede replicarse allí con una agradable interfaz gráfica! Disfrutarfuente