Como posso obter 'diff' para mostrar apenas as linhas adicionadas e excluídas? Se diff não pode fazer isso, qual ferramenta pode? Take-2

3

Eu tenho 2 arquivos classificados produzidos por

xxx>find /store -type f -print | sort > /tmp/invent.txt
xxx>find /fbkup -type f -print | sort > /tmp/backup.txt

Eu quero do diff uma lista de nomes de arquivos faltando em / store que ainda estão em / backup, sem quaisquer < > anotações, apenas um arquivo de saída contendo exatamente os mesmos registros de / tmp / backup para os quais não havia correspondência em /tmp/invent.txt.

xxx>diff -??? /tmp/invent.txt /tmp/invent.txt | xargs ...
    
por Andreas 18.01.2013 / 02:17

4 respostas

3

Diferencie seus arquivos, use o awk para encontrar as linhas desejadas ( /^< ), retire o bit inicial ( gsub(/^</,"") ) e imprima a linha correspondente.

diff file1 file2 | awk '/^</ {gsub(/^</,""); print}'

Então, se você quer um forro, você pode até fazer algo assim.

diff <(cd /store ; find . -type f -print | sort) \
     <(cd /fbkup ; find . -type f -print | sort) | \
     awk '/^</ {gsub(/^</,""); print}'
    
por 18.01.2013 / 02:55
3

Não use diff , use join . Como seus arquivos de entrada já são sort ed, o seguinte deve produzir exatamente a saída solicitada:

join -v 2 /tmp/invent.txt /tmp/backup.txt > /tmp/in-backup-but-not-invent.txt

(Se os caminhos dos arquivos em /tmp/backup.txt ou /tmp/invent.txt contiverem espaço em branco, então join pode não funcionar corretamente com as opções acima. Nesse caso, você terá que verificar a opção -t , para especificar um caractere que não seja espaço em branco como separador de campo para join . Você deve escolher como separador de campo um caractere que não apareça em nenhum dos seus caminhos de arquivo. Algo como | ou \ provavelmente basta.)

    
por 18.01.2013 / 03:27
3
for i in 'cat /tmp/invent.txt'; do grep ^$i$ /tmp/backup.txt >/dev/null || echo $i ; done

Isso gerará echo de todos os nomes em /tmp/invent.txt , que não estão em /tmp/backup.txt

Editar

Eu encontrei outra maneira de usar diff : - ( diff -r dir1 dir2 )

-r, --recursive means Recursively compare any subdirectories found.

$ mkdir -p dir1/dir dir2/dir/dir

$ diff -r dir1 dir2
Only in dir2/dir: dir

$ touch dir1/file{a..d}

$ touch dir2/file{a..d}

$ touch dir2/dir/file{a..d}

$ echo hi >  dir2/filea

$ diff -q -r dir1 dir2
Only in dir2/dir: dir
Only in dir2/dir: filea
Only in dir2/dir: fileb
Only in dir2/dir: filec
Only in dir2/dir: filed
Files dir1/filea and dir2/filea differ
    
por 18.01.2013 / 02:33
2

O Diff pode fazer isso, mas eu estou com preguiça de checar.

Experimente comm . comm -2 -3 ou comm -1 -2 , que fornecerá linhas apenas no arquivo A ou linhas somente no arquivo B.

    
por 18.01.2013 / 02:28

Tags