Eu tenho dois diretórios que devem conter os mesmos arquivos e ter a mesma estrutura de diretórios.
Eu acho que algo está faltando em um desses diretórios.
Usando o shell bash, existe uma maneira de comparar meus diretórios e ver se um deles está faltando arquivos que estão presentes no outro?
command-line
AndreaNobili
fonte
fonte
bash --version
?Respostas:
Uma boa maneira de fazer essa comparação é usar
find
commd5sum
, então adiff
.Exemplo
Use find para listar todos os arquivos no diretório e calcule o hash md5 para cada arquivo e canalize-o por nome de arquivo para um arquivo:
Execute o mesmo procedimento para o outro diretório:
Em seguida, compare o resultado dois arquivos com
diff
:Ou como um único comando usando substituição de processo:
Se você deseja ver apenas as alterações:
O comando recortar imprime apenas o hash (primeiro campo) a ser comparado pelo diff. Caso contrário, o diff imprimirá todas as linhas, pois os caminhos do diretório diferem mesmo quando o hash é o mesmo.
Mas você não saberá qual arquivo foi alterado ...
Para isso, você pode tentar algo como
Essa estratégia é muito útil quando os dois diretórios a serem comparados não estão na mesma máquina e você precisa garantir que os arquivos sejam iguais nos dois diretórios.
Outra boa maneira de fazer o trabalho é usar o
diff
comando Git (pode causar problemas quando os arquivos têm permissões diferentes -> todos os arquivos são listados na saída):fonte
find
os arquivos serão listados diferirá em geral entre os dois diretórios.Você pode usar o
diff
comando da mesma maneira que usaria para arquivos:Se você deseja ver também as subpastas e -files, pode usar a
-r
opção:fonte
diff
Também não sabia que funciona para diretórios (o man diff confirmou isso), mas isso não verifica recursivamente se há alterações nos subdiretórios dentro dos subdiretórios.a/b/c/d/a
,x/b/c/d/b
. Veja o quediff a x
lhe dá.-r
opção Isso (diff -r a x
) me dá:Only in a/b/c/d: a. only in x/b/c/d: b.
Como você não está usando o bash, você pode fazê-lo usando o diff com
--brief
e--recursive
:O
man diff
inclui as duas opções:fonte
Aqui está uma alternativa, para comparar apenas nomes de arquivos, e não seu conteúdo:
Essa é uma maneira fácil de listar arquivos ausentes, mas é claro que não detectará arquivos com o mesmo nome, mas com conteúdos diferentes!
(Pessoalmente, uso meu próprio
diffdirs
script, mas isso faz parte de uma biblioteca maior .)fonte
diff
não oferece suporte a partir de agora. Mas hácomm
suporte para isso desde git.savannah.gnu.org/cgit/coreutils.git/commit/… então, quando se trata de um coreutils perto de você, você pode fazercomm -z <(cd folder1 && find -print0 | sort) <(cd folder2 && find -print0 | sort -z)
(cuja saída você pode precisar converter ainda mais no formato você precisa usar o--output-delimiter
parâmetro e ferramentas adicionais).Talvez uma opção seja executar o rsync duas vezes:
Com a linha anterior, você obterá arquivos que estão no dir1 e são diferentes (ou ausentes) no dir2.
O mesmo para dir2
Você pode excluir a
-n
opção de sofrer as alterações. Isso está copiando a lista de arquivos para a segunda pasta.Caso você faça isso, talvez seja uma boa opção
-u
, para evitar a substituição de arquivos mais recentes.Uma linha:
fonte
Se você deseja tornar cada arquivo expansível e recolhível, você pode canalizar a saída
diff -r
para o Vim.Primeiro vamos dar ao Vim uma regra de dobragem:
Agora apenas:
Você pode pressionar
zo
ezc
abrir e fechar dobras. Para sair do Vim, pressione:q<Enter>
fonte
Tarefa bastante fácil de realizar em python:
Substitua valores reais por
DIR1
eDIR2
.Aqui está um exemplo de execução:
Para facilitar a leitura, aqui está um script real em vez de uma linha:
fonte
os.listdir
não fornece nenhuma ordem específica. Portanto, as listas podem ter as mesmas coisas em ordem diferente e a comparação falhará.Inspirado pela resposta de Sergiy, escrevi meu próprio script Python para comparar dois diretórios.
Ao contrário de muitas outras soluções, ele não compara o conteúdo dos arquivos. Também não entra em subdiretórios ausentes em um dos diretórios. Portanto, a saída é bastante concisa e o script funciona rapidamente com diretórios grandes.
Se você o salvar em um arquivo chamado
compare_dirs.py
, poderá executá-lo com o Python3.x:Saída de amostra:
PS Se você precisar comparar tamanhos de arquivo e hashes de arquivo para possíveis alterações, publiquei um script atualizado aqui: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
fonte
cmpdirs dir1 dir2 '/\.git/'
Vou adicionar a esta lista uma alternativa dos NodeJs que escrevi há algum tempo.
dir-compare
fonte
Gostaria de sugerir uma ótima ferramenta que acabei de descobrir: MELD .
Funciona corretamente e tudo o que você pode fazer com o comando
diff
no sistema baseado em Linux pode ser replicado com uma boa interface gráfica! Desfrutarfonte