Tengo una pregunta sobre el comando diff si quiero un diff de directorio recursivo pero solo para un tipo de archivo específico, ¿cómo hacerlo?
Intenté usar la opción de exclusión, pero solo puedo usar un patrón:
$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml
con el comando sólo puedo excluir tipo de archivo XML, a pesar de que hay archivos en la carpeta de tipo de imagen ( png
, gif
, jpg
), txt
, php
, etc.
cómo diferenciar sólo ciertos tipos de archivos.
Respuestas:
Puede especificar
-x
más de una vez.diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2
Desde la sección de comparación de directorios de
info diff
(en mi sistema, tengo que hacerinfo -f /usr/share/info/diff.info.gz
):fuente
Tomado de (una versión de) la página de manual:
-x PAT --exclude=PAT Exclude files that match PAT. -X FILE --exclude-from=FILE Exclude files that match any pattern in FILE.
Por lo tanto, parece que
-x
solo acepta un patrón cuando informa, pero si coloca todos los patrones que desea excluir en un archivo (presumiblemente uno por línea), podría usar la segunda bandera de la siguiente manera:donde exclude.pats es:
fuente
find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
find . -not -name "*.c" -and -not -name "*.h" -and -type f -print0 | xargs -0 basename | grep -E '.*\..+' | sed 's/\./\//g' | xargs basename | xargs printf '*.%s\n' | sort | uniq > X-FILE
quiero creer que eso ayuda, tal vez también en Linux. (En este ejemplo, un sencillo-name "*.[ch]"
está bien, pero no es muy ilustrativo)También puede usar find con -exec para llamar a diff:
cd /destination/dir/1 find . -name *.xml -exec diff {} /destination/dir/2/{} \;
fuente
La falta de un complemento --incluye ...
Podemos hacer una solución alternativa, un archivo de exclusión con todos los archivos, pero lo que queremos incluir. Así que creamos
file1
con buscar todos los archivos que no tienen extensiones que queremos incluir,sed
capturamos el nombre del archivo y es solo:Por ejemplo:
find PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
fuente
find PATH1/ -type f | grep --text -v -e "php$" -e html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
Usé el siguiente comando para encontrar la diferencia de todos los
*.tmpl
archivos entreDIR1
yDIR2
. En mi caso, esto no arrojó ningún falso positivo, pero puede serlo para usted, dependiendo del contenido de su DIRS.diff --brief DIR1 DIR2 | grep tmpl
fuente
En caso de que le resulte conveniente, puede utilizar lo siguiente
Makefile
. Simplemente ejecute: "hacer parche"#Makefile for patches #Exlude following file endings SUFFIX += o SUFFIX += so SUFFIX += exe SUFFIX += pdf SUFFIX += swp #Exlude following folders FOLDER += bin FOLDER += lib FOLDER += Image FOLDER += models OPTIONS = Naur patch: rm test.patch diff -$(OPTIONS) \ $(foreach element, $(SUFFIX) , -x '*.$(element)') \ $(foreach element, $(FOLDER) , -x '$(element)*') \ org/ new/ > test.patch unpatch: rm test.unpatch diff -$(OPTIONS) \ $(foreach element, $(SUFFIX) , -x '*.$(element)') \ $(foreach element, $(FOLDER) , -x '$(element)*') \ new/ org/ > test.unpatch
fuente
La falta de un complemento complementario hace necesario el uso de patrones heurísticos tan complicados como
para encontrar (principalmente) archivos java!
fuente
Si desea diferenciar las fuentes y mantenerlo simple:
diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"
Elimine el último grep si desea obtener los archivos que existen en solo una de las rutas.
fuente
Si bien no evita la existencia
diff
de otros archivos, si su objetivo es producir un archivo de parche, o similar, puede usarfilterdiff
elpatchutils
paquete, por ejemplo, para parchear solo sus.py
cambios:diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch
fuente