Qual é a melhor e mais simples maneira de comparar duas estruturas de diretório sem comparar os dados nos arquivos? Isso funciona bem:
diff -qr dir1 dir2_
Mas é muito lento porque também está comparando arquivos. Existe uma opção para diff ou outra ferramenta CLI simples para fazer isso?
linux
comparison
Jonah
fonte
fonte
-type d
opção da resposta de @ slartibartfast ou verificar minha resposta.Respostas:
O seguinte (se você substituir o primeiro diretório por directory1 e o segundo por directory2) deve fazer o que procura rapidamente:
O princípio fundamental é que ele imprima todos os diretórios, incluindo os caminhos dos subdiretórios em relação aos diretórios baseN do diretório.
Isso pode cair (produzir uma saída estranha) se você tiver retornos de carro em alguns nomes de diretório, mas não em outros.
fonte
diff -rq
apenas mostra que o diretório raiz existe em um e continua.fornecerá uma boa exibição lado a lado das duas hierarquias de diretório com as seções comuns dobradas.
fonte
Eu costumo usar
rsync
para esta tarefa:TENHA MUITO CUIDADO para sempre usar aopção
-n
aka--dry-run
, ou ele irá sincronizar (alterar o conteúdo dos) diretórios.Isso comparará os arquivos com base nos tempos e tamanhos de modificação do arquivo ... Acho que é isso que você realmente deseja, ou pelo menos você não se importa se isso acontecer? Eu tenho a sensação de que você só quer que isso aconteça mais rápido , não que você precise ignorar a diferença entre o conteúdo do arquivo. Se você não listar arquivos diferentes com nomes idênticos, acho que a adição da
--ignore-existing
opção fará isso.Lembre-se também de que não colocar um
/
no final deDIR1
fará com que ele compare o diretórioDIR1
com o conteúdo deDIR2
.A saída acaba sendo um pouco detalhada, mas mostrará quais arquivos / diretórios diferem. Os arquivos / diretórios presentes em
DIR2
e não emDIR1
serão precedidos pela palavradeleting
.Em algumas situações, a resposta de @ slartibartfast pode ser mais apropriada, embora você precise remover a
-type d
opção para ativar a listagem de arquivos que não sejam de diretório.rsync
será mais rápido se você tiver um número significativo de arquivos / diretórios para comparar.fonte
deleting...
texto, mas é provavelmente uma das melhores maneiras de comparar arquivos, mantendo a velocidade. Outras respostas aqui são mais rápidas quando arquivos diferentes não são necessários ... como no exemplo do OP, mas eu realmente gosto dessa.sudo -u nobody rsync -nav --delete d1 d2
desde que os sinalizadores para 'outros' permitam a leitura.Semelhante à resposta ls, mas se você instalar uma árvore , poderá
fonte
diff <( tree dir1 ) <( tree dir2 )
i
bandeira, que não imprime as linhas das árvores (tree -i dir1
, etc). Se a estrutura de diretórios for diferente em um local, os outros arquivos correspondentes poderão ter mais ou menos|
símbolos na saída da árvore, e o diff capturará essas linhas, mesmo que os caminhos dos arquivos sejam idênticos.Eu estava apenas procurando uma solução para este problema. A solução que mais gostei foi:
Ele fornece três colunas: 1 - arquivos apenas em DIR1, 2 - arquivos apenas em DIR2, 3 - arquivos apenas em DIR3 Para obter mais detalhes, consulte esta postagem no blog.
fonte
DIR3
especificado? Tudo o que vejo éDIR1
eDIR2
.DIR1
na coluna 1 , todos os arquivos somente emDIR2
na coluna 2 , e todos os arquivos compartilhados por ambos na coluna 3 . Isso é útil, mas você sabe como remover a coluna 3 e deixar apenas as diferenças? Eu tenho muitos arquivos para classificar, e a maioria é idêntica. Eu não preciso ver o que é o mesmo.comm <(ls DIR1) <(ls DIR2)
não funcionava recursivamente. Para isso eu useicomm <(ls -R1 DIR1) <(ls -R1 DIR2)
.ls -R
rastreia pelos diretórios recursivamente els -1
(observe que é um , não um L )ls
imprime apenas um nome de arquivo por linha.comm -3
(vejaman comm
).Depois, basta diferenciar as duas listas.
fonte
Esta é a solução ideal
--brief switch informa apenas se os arquivos diferem, não os detalhes da diferença.
fonte
-q
a pergunta, que é um apelido para--brief
. Esta resposta não fornece nenhuma informação nova.But it's really slow because it's comparing files too.
use "diff -qr" para obter os diferentes arquivos e, em seguida, filtre a comparação de arquivos com o grep para obter apenas os nomes de arquivos que estão apenas em um dos diretórios.
fonte
Isso funcionou para a minha necessidade específica de encontrar arquivos ausentes nas árvores que correspondam.
fonte
Eu acho que apenas rsync é userfull. porque?
diff é útil apenas para estruturas que mantêm arquivos e diretórios. Diff não fornece códigos de saída adequados quando usamos links simbólicos. Nessa situação, o diff pode retornar 2 códigos de saída, mesmo que src e dst sejam idênticos (horários, tamanhos, nomes, carimbos de data e hora, apontadores de links, etc).
dir, o sistema de arquivos não garante a ordem dos arquivos, mesmo que o conteúdo do diretório src e dst seja idêntico. Talvez você devesse filtrar a saída ls classificando-a. Mas ls puro exibe apenas nomes de nós.
talvez scripts que incluam diff, cmp, test -X para tipos de nó sejam úteis, mas lembre-se da sobrecarga causada por muitas execuções test / cmp. O script será muito lento.
Como de costume, se você quiser obter informações simples "dirs é / não é idêntico", você deve usar o rsync com a opção -n (dry). Se você quiser descobrir o que é diferente, use o comando diff.
fonte