GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo hacer que 'diff -X' ignore rutas específicas y no nombres de archivos?

La lista de directorios debería funcionar; por ejemplo, esto es lo que he usado en un script (suponiendo que gnu diff),

diff -r \
   --exclude="*~" \
   --exclude=".svn" \
   --exclude=".git" \
   --exclude="*.zip*" \
   --exclude="*.gz" \
   --exclude="*.tar" \
   ...etc

...que ignora el contenido de .svn y .git dirs, pero también archivos individuales llamados *.zip /*.gz /etc.

Editar: Para filtrar rutas de la forma dir_a/file1 pero todavía diff archivos con el mismo nombre base, como dir_b/file1 o dir_a/b/file1 , luego una lista de archivos a diff tendría que generarse (por ejemplo, usando find ), y el archivo para comparar derivado de estas rutas; por ejemplo, dado

$ find ONE TWO -type f -print 
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt

generas la lista de archivos a comparar, excluyendo por ejemplo */a/2.txt pero aún comparando otros archivos llamados 2.txt . Simplemente "busque" todos los archivos excepto ONE/a/2.txt (Aquí también se puede usar una expresión regular, como .*/a/2.txt )

$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
    -exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;  

que en efecto ignora ONE/a/2.txt (y TWO/a/2.txt ), pero aún compara los otros archivos llamados 2.txt :

diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt

Editar: O más divertido con find (se deja diversión adicional como ejercicio para el lector), seleccione los archivos o directorios para excluir y luego diff todo lo demás:

$ find ONE \( -regex 'ONE/a/2.txt' -o -name b  -prune \)  \
    -o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \

El ejemplo anterior excluye el archivo específico "{top}/a/2.txt", cualquier directorio llamado "b", y todo lo demás está diferenciado. (En lugar de simple "-name b " también podría usar "-regex '.*/b' " - nota, sin final "/".)


Tuve el mismo problema, así que creé un parche para diff . El parche aún no se ha aceptado, pero puede crear su propia versión de diff con el parche o instálelo en Arch Linux con un paquete AUR.

Aquí está el diff parche.


Para excluir el directorio directory/sub-directory , yo uso

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

Sin embargo, aunque debería funcionar para una sola exclusión, no debería ser posible para una larga lista de ignorados como la que tiene.


Linux
  1. ¿Cómo hacer que Ibus no ignore ~/.xcompose?

  2. ¿Cómo hacer que el archivo sea disperso?

  3. ¿Cómo puedo encontrar un archivo específico desde una terminal Linux?

  4. ¿Cómo hago que un archivo sea de solo lectura de forma permanente en Linux para que ni siquiera el root pueda editarlo?

  5. ¿Cómo hacer que ls ordene por extensión de archivo y luego por nombre?

Comprender las rutas de los archivos y cómo usarlas en Linux

Cómo trabajar con enlaces duros y suaves en Linux

Linux + ¿Cómo ignorar (filtrar) el archivo con espacio?

¿Cómo puedo diferenciar dos secciones del mismo archivo?

¿Cómo hago que un archivo NO sea modificable?

¿Por qué mi crontab no funciona y cómo puedo solucionarlo?