diff -r apenas para determinados tipos de arquivos

8

Existe uma maneira de fazer um diff recursivo de dois diretórios, mas apenas comparar (em seus respectivos lugares) arquivos que correspondam a um predicado de nome de arquivo ou tipo de arquivo específico?

Por exemplo Eu gostaria de fazer algo como

diff -r dir-a dir-b -filenames *.java, ivy.xml, build.xml

... ou melhor:

diff -r dir-a dir-b -filetype text

É evidente que não é obrigatório usar diff , pois suponho que um encantamento com find e -exec diff também possa funcionar (não sei como gerar os caminhos de arquivo complementares no último caso).

    
por Marcus Junius Brutus 21.05.2014 / 21:30

2 respostas

0

Como você mencionou "Claramente, não é obrigatório usar o diff",

Isso deve fazer o trabalho para você meld ser facilmente configurável para o tipo de arquivo a ser ignorado:

além disso, outra alternativa seria escrever um script simples que irá transferir de uma lista branca para uma lista negra e depois a lista negra será passada para o diff com a opção --exclude .

    
por 16.08.2018 / 21:47
0

Shellscript differ-r

Este shellscript pode realizar um diff recursivo de dois diretórios, mas apenas comparar (em seus respectivos lugares) arquivos que correspondam a um nome de arquivo ou padrão de tipo de arquivo específico.

#!/bin/bash greenvid="$ find -type f ./1/ett.txt ./1/two.doc ./1/t r e.txt ./1/sub/only-one.doc ./1/sub/hello.doc ./1/sub/hejsan.doc ./differ-r2 ./differ-r1 ./differ-r ./2/ett.txt ./2/two.doc ./2/t r e.txt ./2/sub/hello.doc ./2/sub/hejsan.doc 33[32m" resetvid="$ ./differ-r Usage: compare files in two directories including subdirectories ./differ-r <source-dir> <target-dir> <pattern> Example: ./differ-r subdir-1 subdir-2 "*.txt" 33[0m" if [ $# -ne 3 ] then echo "Usage: compare files in two directories including subdirectories" echo " $0 <source-dir> <target-dir> <pattern>" echo "Example: $0 subdir-1 subdir-2 \"*.txt\"" exit fi cmd='for pathname do greenvid="$ ./differ-r 1 2 "*.doc" diff "1/two.doc" "2/two.doc" diff "1/sub/only-one.doc" "2/sub/only-one.doc" diff: 2/sub/only-one.doc: No such file or directory diff "1/sub/hello.doc" "2/sub/hello.doc" 2d1 < world diff "1/sub/hejsan.doc" "2/sub/hejsan.doc" $ ./differ-r 1 2 "*.txt" diff "1/ett.txt" "2/ett.txt" 2c2 < stabben --- > farsan diff "1/t r e.txt" "2/t r e.txt" 1c1 < t r e --- > 3 $ $ ./differ-r 1 2 "*" diff "1/ett.txt" "2/ett.txt" 2c2 < stabben --- > farsan diff "1/two.doc" "2/two.doc" diff "1/t r e.txt" "2/t r e.txt" 1c1 < t r e --- > 3 diff "1/sub/only-one.doc" "2/sub/only-one.doc" diff: 2/sub/only-one.doc: No such file or directory diff "1/sub/hello.doc" "2/sub/hello.doc" 2d1 < world diff "1/sub/hejsan.doc" "2/sub/hejsan.doc" $ ./differ-r 2 1 "*" diff "2/ett.txt" "1/ett.txt" 2c2 < farsan --- > stabben diff "2/two.doc" "1/two.doc" diff "2/t r e.txt" "1/t r e.txt" 1c1 < 3 --- > t r e diff "2/sub/hello.doc" "1/sub/hello.doc" 1a2 > world diff "2/sub/hejsan.doc" "1/sub/hejsan.doc" 33[32m" resetvid="rsync --filter="+ <pattern>" --filter="+ */" --filter="- *"--filter="- */" -avcn <source directory>/ <target directory> 33[0m" echo -e "${greenvid}diff \"$pathname\" \"${pathname/'\"$1\"'/'\"$2\"'}\"${resetvid}" diff "$pathname" "${pathname/'\"$1\"'/'\"$2\"'}" done' #echo "$cmd" find "$1" -type f -name "$3" -exec bash -c "$cmd" bash {} +

Demonstração

Arquivos:

$ rsync --filter="+ *.doc" --filter="+ */" --filter="- *" -avcn 1/ 2 sending incremental file list ./ sub/ sub/hello.doc sub/only-one.doc sent 276 bytes received 35 bytes 622.00 bytes/sec total size is 40 speedup is 0.13 (DRY RUN) sent 360 bytes received 41 bytes 802.00 bytes/sec total size is 61 speedup is 0.15 (DRY RUN) olle@bionic64 /media/multimed-2/test/test0/temp $ rsync --filter="+ *.txt" --filter="+ */" --filter="- *" -avcn 1/ 2 sending incremental file list ./ ett.txt t r e.txt sub/ sent 184 bytes received 29 bytes 426.00 bytes/sec total size is 21 speedup is 0.10 (DRY RUN)

Uso:

$ pattern="*.doc"; rsync --filter="+ $pattern" --filter="+ */" --filter="- *" -avcn 1/ 2 | grep "${pattern/\*/.\*}" sub/hello.doc sub/only-one.doc

Executando differ-r :

As linhas de comando diff executadas são impressas com texto verde e a saída, quando não há correspondência é impressa com o texto padrão (branco sobre preto na captura de tela a seguir).

#!/bin/bash LANG=C if [ $# -ne 3 ] then echo "Usage: compare files in two directories including subdirectories" echo " $0 <source-dir> <target-dir> <pattern>" echo "Example: $0 subdir-1 subdir-2 \"*.txt\"" exit fi pattern="$3"; rsync --filter="+ $pattern" --filter="+ */" --filter="- *" \ -avcn "$1"/ "$2" | grep "${pattern//\*/.\*}" | grep -v \ -e '/$' \ -e '^sending incremental file list$' \ -e '^sent.*received.*sec$' \ -e '^total size is.*speedup.*(DRY RUN)$'

rsync com filtro

Se você não precisa obter nenhuma saída descrevendo a diferença, apenas saiba quais arquivos são diferentes ou ausentes (para que rsync gostaria de copiá-los), você pode usar a seguinte linha de comando.

#!/bin/bash greenvid="$ find -type f ./1/ett.txt ./1/two.doc ./1/t r e.txt ./1/sub/only-one.doc ./1/sub/hello.doc ./1/sub/hejsan.doc ./differ-r2 ./differ-r1 ./differ-r ./2/ett.txt ./2/two.doc ./2/t r e.txt ./2/sub/hello.doc ./2/sub/hejsan.doc 33[32m" resetvid="$ ./differ-r Usage: compare files in two directories including subdirectories ./differ-r <source-dir> <target-dir> <pattern> Example: ./differ-r subdir-1 subdir-2 "*.txt" 33[0m" if [ $# -ne 3 ] then echo "Usage: compare files in two directories including subdirectories" echo " $0 <source-dir> <target-dir> <pattern>" echo "Example: $0 subdir-1 subdir-2 \"*.txt\"" exit fi cmd='for pathname do greenvid="$ ./differ-r 1 2 "*.doc" diff "1/two.doc" "2/two.doc" diff "1/sub/only-one.doc" "2/sub/only-one.doc" diff: 2/sub/only-one.doc: No such file or directory diff "1/sub/hello.doc" "2/sub/hello.doc" 2d1 < world diff "1/sub/hejsan.doc" "2/sub/hejsan.doc" $ ./differ-r 1 2 "*.txt" diff "1/ett.txt" "2/ett.txt" 2c2 < stabben --- > farsan diff "1/t r e.txt" "2/t r e.txt" 1c1 < t r e --- > 3 $ $ ./differ-r 1 2 "*" diff "1/ett.txt" "2/ett.txt" 2c2 < stabben --- > farsan diff "1/two.doc" "2/two.doc" diff "1/t r e.txt" "2/t r e.txt" 1c1 < t r e --- > 3 diff "1/sub/only-one.doc" "2/sub/only-one.doc" diff: 2/sub/only-one.doc: No such file or directory diff "1/sub/hello.doc" "2/sub/hello.doc" 2d1 < world diff "1/sub/hejsan.doc" "2/sub/hejsan.doc" $ ./differ-r 2 1 "*" diff "2/ett.txt" "1/ett.txt" 2c2 < farsan --- > stabben diff "2/two.doc" "1/two.doc" diff "2/t r e.txt" "1/t r e.txt" 1c1 < 3 --- > t r e diff "2/sub/hello.doc" "1/sub/hello.doc" 1a2 > world diff "2/sub/hejsan.doc" "1/sub/hejsan.doc" 33[32m" resetvid="rsync --filter="+ <pattern>" --filter="+ */" --filter="- *"--filter="- */" -avcn <source directory>/ <target directory> 33[0m" echo -e "${greenvid}diff \"$pathname\" \"${pathname/'\"$1\"'/'\"$2\"'}\"${resetvid}" diff "$pathname" "${pathname/'\"$1\"'/'\"$2\"'}" done' #echo "$cmd" find "$1" -type f -name "$3" -exec bash -c "$cmd" bash {} +

Demonstração

$ rsync --filter="+ *.doc" --filter="+ */" --filter="- *" -avcn 1/ 2 sending incremental file list ./ sub/ sub/hello.doc sub/only-one.doc sent 276 bytes received 35 bytes 622.00 bytes/sec total size is 40 speedup is 0.13 (DRY RUN) sent 360 bytes received 41 bytes 802.00 bytes/sec total size is 61 speedup is 0.15 (DRY RUN) olle@bionic64 /media/multimed-2/test/test0/temp $ rsync --filter="+ *.txt" --filter="+ */" --filter="- *" -avcn 1/ 2 sending incremental file list ./ ett.txt t r e.txt sub/ sent 184 bytes received 29 bytes 426.00 bytes/sec total size is 21 speedup is 0.10 (DRY RUN)

Se você quiser uma saída limpa sem comentar linhas e sem diretórios, você pode grep da saída assim,

$ pattern="*.doc"; rsync --filter="+ $pattern" --filter="+ */" --filter="- *" -avcn 1/ 2 | grep "${pattern/\*/.\*}" sub/hello.doc sub/only-one.doc

Shellscript rsync-diff

Este one-liner pode ser feito no comando do núcleo de um bloco de letras rsync-diff .

#!/bin/bash LANG=C if [ $# -ne 3 ] then echo "Usage: compare files in two directories including subdirectories" echo " $0 <source-dir> <target-dir> <pattern>" echo "Example: $0 subdir-1 subdir-2 \"*.txt\"" exit fi pattern="$3"; rsync --filter="+ $pattern" --filter="+ */" --filter="- *" \ -avcn "$1"/ "$2" | grep "${pattern//\*/.\*}" | grep -v \ -e '/$' \ -e '^sending incremental file list$' \ -e '^sent.*received.*sec$' \ -e '^total size is.*speedup.*(DRY RUN)$'     
por 30.11.2018 / 09:04