Estou procurando executar um comando Linux que compare recursivamente dois diretórios e produza apenas os nomes dos arquivos diferentes. Isso inclui qualquer coisa que esteja presente em um diretório e não no outro ou vice-versa e diferenças de texto.
linux
command-line
diff
barfoon
fonte
fonte
diff
página de manual no CentOS 7 descreve-q
como "reportar apenas quando os arquivos diferem", o que é menos claro do que o que você escreveu.-x PATTERN
no comando para excluir determinados subdiretórios. Por exemplo,diff -qr repo1 repo2 -x ".git"
comparará dois diretórios, mas excluirá os caminhos de arquivo com ".git" neles.Você também pode usar o rsync
fonte
--size-only
perderá arquivos de tamanho idêntico, mas com conteúdo diferente, por exemplo, old / version.txt "29a" new / version.txt "29b" . Use em vez disso:rsync -ric --dry-run old/ new/
onde o argumento "-i" permite obter a lista de arquivos diretamente viarsync -ric --dry-run old/ new/ | cut -d" " -f 2
Se você deseja obter uma lista de arquivos que estão apenas em um diretório e não seus subdiretórios e apenas seus nomes de arquivo:
Se você deseja listar recursivamente todos os arquivos e diretórios diferentes com seus caminhos completos:
Dessa forma, você pode aplicar comandos diferentes a todos os arquivos.
Por exemplo, eu poderia remover todos os arquivos e diretórios que estão no dir1, mas não no dir2:
fonte
No meu sistema linux para obter apenas os nomes de arquivos
fonte
audit-0.0.234/audit-data-warehouse-0.0.234/ audit-0.0.235/audit-data-warehouse-0.0.235/
diff -qrN /dir1 /dir2 | cut -f2 -d' '
funciona bem para mim!A abordagem da execução
diff -qr old/ new/
tem uma grande desvantagem: ela pode perder arquivos nos diretórios criados recentemente. Por exemplo, no exemplo abaixo, o arquivodata/pages/playground/playground.txt
não está na saída dediff -qr old/ new/
enquanto o diretóriodata/pages/playground/
está (procure playground.txt no seu navegador para comparar rapidamente). Também publiquei a seguinte solução no Unix e Linux Stack Exchange , mas vou copiá-la aqui também:Para criar uma lista de arquivos novos ou modificados programaticamente, a melhor solução que eu poderia encontrar é usar rsync , sort e uniq :
Deixe-me explicar com este exemplo: queremos comparar dois lançamentos dokuwiki para ver quais arquivos foram alterados e quais foram criados recentemente.
Buscamos os alcatrões com o wget e os extraímos nos diretórios
old/
enew/
:A execução do rsync de uma maneira pode perder os arquivos recém-criados, como mostra a comparação do rsync e do diff aqui:
produz a seguinte saída:
A execução do rsync somente em uma direção perde os arquivos recém-criados e, ao contrário, os arquivos excluídos são comparados, compare a saída do diff:
produz a seguinte saída:
Executar o rsync nos dois sentidos e classificar a saída para remover duplicatas revela que o diretório
data/pages/playground/
e o arquivodata/pages/playground/playground.txt
foram perdidos inicialmente:produz a seguinte saída:
rsync
é executado com estes argumentos:-r
"recursar em diretórios",-c
para comparar também arquivos de tamanho idêntico e apenas "pular com base na soma de verificação, não no tempo e tamanho da modificação",-n
para "executar uma avaliação sem alterações feitas" e--out-format="%n"
para "gerar atualizações usando o FORMAT especificado", que é "% n" aqui apenas para o nome do arquivoA saída (lista de arquivos) de
rsync
ambas as direções é combinada e classificada usandosort
, e essa lista classificada é então condensada removendo todas as duplicatas comuniq
fonte
diff new/ old/
) para ver quais diretórios foram excluídos?diff -qr new/ old/
no exemplo acima com os dokuwiki tars produz a mesma saída quediff -qr old/ new/
- ou seja, você vê que o diretório é novo / ausente, mas não os arquivos nelefonte