Se eu quiser encontrar as diferenças entre duas árvores de diretório, normalmente apenas executo:
diff -r dir1/ dir2/
Isso mostra exatamente quais são as diferenças entre os arquivos correspondentes. Estou interessado em obter apenas uma lista dos arquivos correspondentes cujo conteúdo é diferente. Eu assumi que isso seria simplesmente uma questão de passar uma opção de linha de comando diff
, mas não consegui encontrar nada na página de manual.
Alguma sugestão?
dircmp
comando no unix (não linux)Respostas:
Você disse que Linux, então você teve sorte (pelo menos ele deve estar disponível, não tenho certeza quando foi adicionado):
Deve fazer o que você precisa.
Se você também deseja ver diferenças nos arquivos que podem não existir nos dois diretórios:
fonte
diff -qr dir1/ dir2/
e minha versão estendida paradiff -qr dir1/ dir2/ | grep ' differ'
--brief
para o atalho-q
.--brief
.-brief
é interpretado como-b -r -i -e -f
, em outras palavras, como um conjunto de sinalizadores, não como uma única opção.O comando que eu uso é:
É exatamente o mesmo que o de Mark :) Mas a resposta dele me incomodou, pois usa diferentes tipos de sinalizadores, e me fez olhar duas vezes. Usando os sinalizadores mais detalhados de Mark, seria:
Peço desculpas por postar quando a outra resposta for perfeitamente aceitável. Não consegui me parar ... trabalhando em ser menos pedante.
fonte
q
significa? É uma abreviação de alguma coisa? Não consigo encontrar qualquer lógica por trás daq
..q
é paraquiet
, geralmente significando menos detalhado.Eu gosto de usar
git diff --no-index dir1/ dir2/
, porque ele pode mostrar as diferenças de cor (se você tiver essa opção definida na sua configuração do git) e porque mostra todas as diferenças em uma saída paginada longa usando "less".fonte
--no-index
mais em stackoverflow.com/a/1792477/473390 . Atualizei a resposta @ alan-porter.--name-status
à linha de comando, ela mostrará apenas a lista de nomes de arquivos com sinalizadores "M / A / D" para o status Modificado / Adicionado / Excluído.Esses dois comandos fazem basicamente a coisa solicitada:
A escolha entre eles depende da localização de dir1 e dir2:
Quando os diretórios residem em duas unidades separadas, o diff supera o rsync. Mas quando os dois diretórios comparados estão na mesma unidade, o rsync é mais rápido. Isso porque o diff coloca uma carga quase igual nos dois diretórios em paralelo, maximizando a carga nas duas unidades.
O rsync calcula somas de verificação em blocos grandes antes de compará-los. Isso agrupa as operações de E / S em grandes blocos e leva a um processamento mais eficiente quando as coisas acontecem em uma única unidade.
fonte
rsync --options /usr /bin /var /sbin /lib /old_root
efetivamente comparar raiz atual/
(especificando todos os subdiretórios no mesmo) e/old_root
(contendo, por exemplo, algum apoio mais antiga/
), que é algodiff -r
lata faça. E se você presumir que arquivos com o mesmo tamanho, permissões e carimbos de data / hora provavelmente não foram alterados, deixar de fora--checksum
fornecerá uma verificação extremamente rápida (se não for o caso) de quais arquivos podem ter sido alterados.--delete
comrsync
?--dry-run
bandeira) nada é realmente apagado,rsync
apenas impressões quais arquivos estão em dir1, mas não em dir2--dry-run
primeiro sempre para não esquecê-lo acidentalmente.O Meld também é uma ótima ferramenta para comparar dois diretórios:
meld dir1/ dir2/
O Meld tem muitas opções para comparar arquivos ou diretórios. Se dois arquivos diferirem, é fácil entrar no modo de comparação de arquivos e ver as diferenças exatas.
fonte
meld
se torna terrivelmente lento se usado em diretórios grandes. Existe algo que lide com diretórios grandes melhor?find dir1 dir2 | cut -d/ -f2- | sort | uniq --unique
meld <(find dir1 -ls ) <(find dir2 -ls)
funciona muito bem, usando a substituição do processo bash. (zsh da=(command)
funciona ainda melhor.)O 'faturamento' do compatriota de canal (da freenode / # centos fame) compartilhou seu método comigo:
Incluir a barra final do diretório final não importa.
Além disso, parece que a
-u
opção não está disponível em algumas versões mais antigas / de servidor do diff.A diferença de diferenças:
fonte
--new-file/-N
que faz o diff considerar que os arquivos ausentes estão vazios e--text/-a
que faz com que ele considere toda a entrada binária como texto. Não vejo as vantagens deste caso de uso específico.O Diffoscope é uma excelente ferramenta de comparação de diretório baseada em linha de comando.
Eu gosto especialmente que ele pode ser diferente em arquivos:
Ele não apenas informará quais arquivos diferem, mas também como eles diferem.
fonte
Para encontrar o diff, use este comando:
-r também difere todos os subdiretórios -q diz ao diff para relatar apenas quando os arquivos diferem.
--brief mostrará os arquivos que dosent existem no diretório
Se não
podemos usar o Meld, que mostrará na janela gráfica que é fácil encontrar a diferença.
fonte
--brief
e-q
são a mesma opção. Sua declaração faz parecer que são diferentes, mas não são.Você também pode usar
Rsync
efind
. Parafind
:Mas arquivos com os mesmos nomes e nas mesmas subpastas, mas com conteúdo diferente, não serão mostrados nas listas.
Se você é um fã de GUI, pode verificar Meld que @Alexander mencionou. Funciona bem no Windows e no Linux.
fonte
Relatar diferenças entre dirA e dirB, além de atualizar / sincronizar.
rsync -auv <dirA> <dirB>
fonte