Eu tenho uma pergunta sobre o comando diff, se eu quiser um diff de diretório recursivo, mas apenas para um tipo de arquivo específico, como fazer isso?
Tentei usar a opção de exclusão, mas só consigo usar um padrão:
$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml
com o comando só posso excluir tipo de arquivo xml, mesmo que haja arquivos no tipo de imagem pasta ( png
, gif
, jpg
), txt
, php
, etc
como diferenciar apenas certos tipos de arquivo.
Respostas:
Você pode especificar
-x
mais de uma vez.diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2
Na seção Comparando diretórios de
info diff
(no meu sistema, tenho que fazerinfo -f /usr/share/info/diff.info.gz
):fonte
Retirado de (uma versão da) 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.
Portanto, parece que
-x
aceita apenas um padrão conforme você relata, mas se você colocar todos os padrões que deseja excluir em um arquivo (provavelmente um por linha), poderá usar o segundo sinalizador assim:onde exclude.pats é:
fonte
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
quero acreditar que isso ajuda, talvez no Linux também. (Neste exemplo, um único-name "*.[ch]"
está correto, mas não é muito ilustrativo)Você também pode usar find com -exec para chamar diff:
cd /destination/dir/1 find . -name *.xml -exec diff {} /destination/dir/2/{} \;
fonte
A falta de um complementar --include ....
Podemos fazer uma solução alternativa, um arquivo de exclusão com todos os arquivos, exceto o que queremos incluir. Assim, criamos
file1
com um find todos os arquivos que não têm extensões que queremos incluir,sed
pegamos o nome do arquivo e é apenas:Por exemplo:
find PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
fonte
find PATH1/ -type f | grep --text -v -e "php$" -e html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
Usei o seguinte comando para encontrar o diff de todos os
*.tmpl
arquivos entreDIR1
eDIR2
. No meu caso, isso não rendeu nenhum falso positivo, mas pode render para você, dependendo do conteúdo do seu DIRS.diff --brief DIR1 DIR2 | grep tmpl
fonte
Se você deseja diferenciar as fontes e mantê-lo simples:
diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"
Remova o último grep se quiser obter os arquivos que existem em apenas um dos caminhos.
fonte
grep "^Files"
paragrep "^Dateien"
Caso você ache conveniente, você pode usar o seguinte
Makefile
. Basta executar: "make patch"#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
fonte
A falta de um complemento --include torna necessário o uso de padrões heurísticos complicados como
para encontrar (principalmente) arquivos java!
fonte
Embora não evite o real
diff
de outros arquivos, se seu objetivo é produzir um arquivo de patch, ou semelhante, você pode usarfilterdiff
dopatchutils
pacote, por exemplo, para corrigir apenas suas.py
alterações:diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch
fonte