¿Cuál es la forma mejor y más simple de comparar dos estructuras de directorios sin comparar realmente los datos en archivos? Esto funciona bien:
diff -qr dir1 dir2_
Pero es realmente lento porque también está comparando archivos. ¿Hay un interruptor para diff u otra herramienta cli simple para hacer esto?
linux
comparison
Jonás
fuente
fuente
-type d
opción de la respuesta de @ slartibartfast o consultar mi respuesta.Respuestas:
Lo siguiente (si sustituye el primer directorio por el directorio1 y el segundo por el directorio2) debe hacer lo que está buscando y rápidamente:
El principio fundamental es que imprime todos los directorios, incluidas las rutas de subdirectorio en relación con el directorio baseN directorios.
Esto podría caerse (producir resultados extraños) si tiene retornos de carro en algunos de los nombres de directorio pero no en otros.
fuente
diff -rq
solo muestra que el directorio raíz existe en uno, y continúa.le dará una buena visualización de lado a lado de las dos jerarquías de directorios con las secciones comunes dobladas.
fuente
Usualmente uso
rsync
para esta tarea:TENGA MUCHO CUIDADO de usar siempre laopción
-n
aka--dry-run
, o sincronizará (cambiará el contenido de) los directorios.Esto comparará los archivos en función de los tiempos y tamaños de modificación de archivos ... Creo que eso es lo que realmente quieres, o al menos no te importa si lo hace. Tengo la sensación de que solo quieres que suceda más rápido , no que lo necesites para ignorar la diferencia entre el contenido del archivo. Si desea que no enumere archivos diferentes con nombres idénticos, creo que la adición de la
--ignore-existing
opción lo hará.También tenga en cuenta que no poner un
/
al final deDIR1
hará que compare el directorioDIR1
con el contenido deDIR2
.El resultado termina siendo un poco detallado, pero le mostrará qué archivos / directorios difieren. Los archivos / directorios presentes en
DIR2
y no enDIR1
estarán precedidos por la palabradeleting
.Para algunas situaciones, la respuesta de @ slartibartfast puede ser más apropiada, aunque deberá eliminar la
-type d
opción para habilitar la lista de archivos que no son de directorio.rsync
será más rápido si tiene una cantidad significativa de archivos / directorios para comparar.fuente
deleting...
texto, pero probablemente sea una de las mejores formas de comparar archivos mientras se mantiene la velocidad. Las otras respuestas aquí son más rápidas cuando no se requiere diferenciar archivos ... como en el ejemplo de OP, pero realmente me gusta esta.sudo -u nobody rsync -nav --delete d1 d2
siempre que las banderas para 'otros' permitan la lectura.Similar a la respuesta de ls, pero si instala el árbol , puede
fuente
diff <( tree dir1 ) <( tree dir2 )
i
bandera, que no imprime las líneas del árbol (tree -i dir1
, etc.). Si la estructura del directorio es diferente en un lugar, los otros archivos que coinciden pueden tener más o menos|
símbolos en la salida del árbol, y diff capturará esas líneas incluso si las rutas de los archivos son idénticas.Estaba buscando una solución para este problema. La solución que más me gustó fue:
Le da 3 columnas: 1 - archivos solo en DIR1, 2 - archivos solo en DIR2, 3 - archivos solo en DIR3 Para obtener más detalles, consulte esta publicación de blog.
fuente
DIR3
especifica? Todo lo que veo esDIR1
yDIR2
.DIR1
en la columna 1 , todos los archivos sólo enDIR2
en la columna 2 , y todos los archivos compartidos por tanto , en la columna 3 . Eso es algo útil, pero ¿sabe cómo se puede eliminar la columna 3 y dejar solo las diferencias? Tengo muchos archivos para ordenar, y la mayoría es idéntico. No necesito ver qué es lo mismo.comm <(ls DIR1) <(ls DIR2)
no funcionaba recursivamente. Para eso lo usécomm <(ls -R1 DIR1) <(ls -R1 DIR2)
.ls -R
rastrea los directorios de forma recursiva yls -1
(tenga en cuenta que es uno , no un L ) hace quels
imprima solo un nombre de archivo por línea.comm -3
(verman comm
).Entonces simplemente diferencie las dos listas.
fuente
Esta es la solución óptima.
- breve interruptor informa solo si los archivos difieren, no los detalles de la diferencia.
fuente
-q
en la pregunta, que es un alias para--brief
. Esta respuesta no proporciona ninguna información nueva.But it's really slow because it's comparing files too.
use "diff -qr" para obtener los diferentes archivos y luego filtre la comparación de archivos con grep para obtener solo los nombres de archivo que solo están en uno de los directorios.
fuente
Esto funcionó para mi necesidad específica de encontrar archivos faltantes en los árboles que se espera que coincidan.
fuente
Creo que solo rsync es userfull. ¿por qué?
diff es útil solo para estructuras que mantienen archivos y directorios. Diff no proporciona códigos de salida adecuados cuando usamos enlaces simbólicos. En esa situación, diff puede devolver 2 códigos de salida, incluso si src y dst son idénticos (tiempos, tamaños, nombres, marcas de tiempo, enlaces de software, etc.).
dir, el sistema de archivos no garantiza el orden de los archivos, incluso si los contenidos del directorio en src y dst son idénticos. Tal vez deberías filtrar la salida ls ordenándola. Pero ls puro solo muestra nombres de nodo.
tal vez la secuencia de comandos que incluye diff, cmp, test -X para los tipos de nodo será útil, pero recuerde sobre la sobrecarga realizada por muchas ejecuciones de prueba / cmp. El guión será muy lento.
Como de costumbre, si desea obtener información simple "dirs es / no es idéntico", debe usar rsync con la opción -n (dry). Si desea encontrar lo que es diferente, use el comando diff.
fuente