¿Puede gnu diff comparar recursivamente solo nombres de archivos en diferentes estructuras de carpetas?

¿Puede gnu diff comparar recursivamente solo nombres de archivos en diferentes estructuras de carpetas?

Sé que puedo comparar recursivamente dos directorios diff -qry 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, file01se consideraría una coincidencia. ¿Es esto posible con diffo tengo que hacer un findbucle anidado e iterar a través de cada uno?

Respuesta1

Yo usaría findy 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 tree2cada archivo de tree1y 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.

información relacionada