Arquivos DIF presentes em dois diretórios diferentes

303

Eu tenho dois diretórios com a mesma lista de arquivos. Eu preciso comparar todos os arquivos presentes nos dois diretórios usando o diffcomando Existe uma opção simples de linha de comando para fazê-lo ou preciso escrever um script de shell para obter a listagem de arquivos e iterá-los?

Sudar
fonte

Respostas:

422

Você pode usar o diffcomando para isso:

diff -bur folder1/ folder2/

Isso produzirá um diff recursivo que ignora espaços, com um contexto unificado:

  • sinalizador b significa ignorar espaço em branco
  • u flag significa um contexto unificado (3 linhas antes e depois)
  • sinalizador r significa recursivo
Laurent Etiemble
fonte
9
Você pode ter acesso ao diffcomando baixando os utilitários GNU para Win32 .
Laurent Etiemble
7
Também descobri que a opção --brief é útil; você obtém uma lista de arquivos alterados e pode processá-los separadamente
Dariusz
27
Para outros que se perguntam, -bignora as alterações de espaço em branco e -ufornece 3 linhas de buffer.
rattray 23/09/14
28
É mais fácil de lembrar esse comando se você usar esfregar em vez de broca ou sejadiff -rub folder1/ folder2/
SomeGuyOnAComputer
11
Eu imagino -burque seria fácil lembrar se você vivesse em um clima frio.
21717 AlanH
126

Se você estiver interessado apenas em ver os arquivos que diferem, poderá usar:

diff -qr dir_one dir_two | sort

A opção "q" mostrará apenas os arquivos que diferem, mas não o conteúdo, e "classificar" organizará a saída em ordem alfabética.

Suresh
fonte
1
Isso é ótimo! Também funciona de maneira eficiente - ou seja, se um subdiretório inteiro existe apenas em um dos diretórios, ele para de se repetir e relata apenas o subdiretório (sem o conteúdo do sucessor). muito agradável!!
SomethingSomething
Este é realmente um bom primeiro passo: ver o que, se alguma coisa, não diferem, e , em seguida, fazer um detalhado diffem cada par de arquivos diferentes. A abordagem de alguém seria totalmente diferente se apenas um ou dois arquivos diferissem versus se dezenas de arquivos fossem diferentes. Eu poderia me perder na saída de diffdezenas de arquivos de uma só vez!
precisa saber é
Além disso, pode incluir -x PATTERNno comando para excluir determinados subdiretórios. Por exemplo, diff -qr repo1 repo2 -x ".git"comparará dois diretórios (repo1 e repo2), mas excluirá os arquivos na pasta .git dos respectivos diretórios.
ViFI 16/04
20

Diff tem uma opção -rque se destina a fazer exatamente isso.

diff -r dir1 dir2

CodeRain
fonte
11

diffalém de comparar dois arquivos, ele pode, usando a -ropção, percorrer árvores de diretórios inteiras, verificando recursivamente as diferenças entre subdiretórios e arquivos que ocorrem em pontos comparáveis ​​em cada árvore.

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...
miku
fonte
3

Se for GNU diff, você poderá apontá-lo para os dois diretórios e usar a opção -r.

Caso contrário, tente usar

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

NB Como apontado por Dennis na seção de comentários, você realmente não precisa fazer a substituição de comando no ls. Faço isso há tanto tempo que praticamente o faço no piloto automático e substituindo o comando necessário para obter minha lista de arquivos para comparação.

Também esqueci de adicionar que eu faço '\ ls' para desativar temporariamente meu apelido de ls no GNU ls, para que eu perca as informações de formatação de cores da lista retornada pelo GNU ls.

Rob Wells
fonte
2
Não é necessário usar ls:for i in ./dir1/*
Pausado até novo aviso.
1
@ Dennis, atalho funky. +1. Estou tão acostumado a fazer a substituição de comandos, embora seja automático e apenas uso o comando que preciso, por exemplo, às vezes, estou usando o find. Usar ls também me permite brincar mais com a lista dir, por exemplo, com base no tempo inverso, em vez da sequência padrão.
Rob Wells
0

Aqui está um script para mostrar as diferenças entre os arquivos em duas pastas. Funciona recursivamente. Alterar dir1 e dir2.

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )
Evgeny Karpov
fonte
0

Se você especificamente não deseja comparar o conteúdo dos arquivos e apenas verificar qual deles não está presente nos dois diretórios, você pode comparar as listas de arquivos geradas por outro comando.

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'diz findpara não prefixar os caminhos de saída com o diretório raiz.

Também adicionei sortpara garantir que a ordem dos arquivos será a mesma nas duas chamadas de find.

O grepfinal remove informações sobre linhas de entrada idênticas.

NO_NAME
fonte
-4

Tente o seguinte:

diff -rq /path/to/folder1 /path/to/folder2      
Sonali Birari
fonte
2
Isso duplica uma resposta existente e não adiciona novo conteúdo. Não poste uma resposta, a menos que você realmente tenha algo novo para contribuir.
perfil completo de Toby Speight