Sé que puedo comparar recursivamente dos directorios diff -qr
y generar solo las diferencias. Sin embargo, esto parece comparar las posiciones de los archivos dentro de los árboles (por ejemplo, /a/b/file01 != /b/c/file01
).
Quiero comparar dos árboles diferentes y obtener como resultado solo archivos únicos (independientemente de su posición en el árbol). Entonces, en el ejemplo anterior, file01
se consideraría una coincidencia. ¿Es esto posible con diff
o tengo que hacer un find
bucle anidado e iterar a través de cada uno?
Respuesta1
Yo usaría find
y algunas travesuras:
Digamos que las dos rutas son /a y /b:
find /a/ /b/ -exec basename \{} \; | sort | uniq -u
Entonces esto es "buscar todos los archivos en /a y /b, y generar sus nombres base (es decir, ruta eliminada), luego ordenarlos y luego generar cualquier valor único en la lista".
Si luego desea encontrar dónde están estos archivos en los directorios, podemos envolver todo en un bucle y encontrarlos:
for i in `find /a/ /b/ -exec basename \{} \; | sort | uniq -u`; do find /a/ /b/ -name $i; done
Respuesta2
No creo que sea posible con diff
. Supongo que estás pensando en algo como:
find tree1 -type f | while f=`line` ; do diff $f `find tree2 -type f -name "${f##*/}"`; done
(Esto necesita ser elaborado para permitir múltiples o ninguna instancia de tree2
cada archivo de tree1
y espacios en blanco incrustados).
Lo que puedes hacer para acelerarlo es guardar la lista de archivos primero tree2
:
find tree2 -type f >tree2.list
find tree1 -type f | while f=`line` ; do diff $f `grep <tree2.list "/${f##*/}$"`; done
Esto significa que para cada archivo, en lugar de buscar en una jerarquía de directorios, solo se analiza un archivo.