Como comparar diferenças entre diretórios (linux)

24

Eu tenho dois diretórios - um do backup anterior e o segundo do backup mais recente. Como faço para comparar quais alterações foram feitas nos arquivos no diretório do backup mais recente no Linux? Além disso, como exibo alterações em, por exemplo, arquivos de texto e php - estou pensando em algo como o histórico de revisões na wikipedia, onde você vê a versão antiga em um lado da tela e a versão mais recente em outro e as alterações são destacadas. Como faço para conseguir algo assim?

editar: Como também comparo o diretório remoto com o local?

Phil
fonte

Respostas:

35

Na página do manual diff:

Se os arquivos from-file e to-file são diretórios, o diff compara os arquivos correspondentes nos dois diretórios, em ordem alfabética; essa comparação não é recursiva, a menos que a opção -r ou --recursive seja fornecida. diff nunca compara o conteúdo real de um diretório como se fosse um arquivo. O arquivo totalmente especificado pode não ser uma entrada padrão, porque a entrada padrão não tem nome e a noção de arquivo '' com o mesmo nome '' não se aplica.

Então, para comparar diretórios: diff --brief -r dir1 dir2

Para comparar arquivos lado a lado: diff --side-by-side file1 file2

Sean Staats
fonte
muito legal, eu vou experimentá
Phil
... Gostaria de saber como faço para comparar o diretório remoto com o local?
26410 Phil
1
Você precisaria montar o diretório remoto na máquina local. No entanto, você pode comparar remotamente arquivos da seguinte maneira: ssh REMOTE_SERVER "cat / path / to / some / file" | diff - lado a lado / caminho para algum arquivo - Outra coisa, o comando 'sdiff' funciona como 'diff - lado a lado' se você deseja salvar algumas digitações.
23410 Sean Staats
2
Use o NFS para montar o diretório remoto. No servidor remoto (server-b), edite / etc / exportações e coloque o seguinte: / path / of / directory / para / compartilhar server-a.ip.address (ro, no_root_squash) Inicie o NFS no server-b (/etc/init.d/nfs start) Monte no servidor local (server-a) adicionando o seguinte ao / etc / fstab: server-b.ip.add: / path / of / directory / to / share / mnt / server-b nfs rsize = 32768, wsize = 32768, rw 0 0 Em seguida, no servidor-a, mkdir / mnt / server-b; mount / mnt / server-b Obrigado pelos votos.
23810 Sean Staats
2
Você pode usar sshfspara criar um diretório de rede temporário ad-hoc, em vez de usar o NFS.
21710 Dan Danreatta
3

Assumindo:

  • nós estamos www1comparando com controle remotowww2
  • existe autenticação de chave pública do local www1para o remotowww2
  • comparamos como o mesmo usuário em local www1e remotowww2
encontre / var / www / html / -name "*" -exec md5sum -b {} \; | grep -v "/ var / www / html / exclude_este diretório"> local.md5
ssh www2 "encontre / var / www / html / -name '*' -exec md5sum -b {} \; | grep -v / var / www / html / exclude_esta dir> remote.md5"
scp www2: remote.md5.
diff local.md5 remote.md5 
user69366
fonte
3

Você realmente deseja combinar o poder de rsyncreduzir o consumo de largura de banda com o poder de difffornecer flexibilidade e flexibilidade.

Então, algo como isto:

cp -R $local $bak
rsync $server:$remdir/* $local/
rsync $local/ $server:$remdir/* 
diff -wur $local $bak

Eu acho que você poderia ajustar um pouco isso se estivesse fazendo isso com frequência, em rsyncvez de usar cpna primeira linha - obviamente, na última linha, você tem todo o poder de diffformatá-lo como quiser. Provavelmente com y no caso dos OPs

A desvantagem dessa abordagem é que você acaba usando o dobro do espaço local, mas com menos de US $ 1 / gig, quem se importa?

ErichBSchulz
fonte
cp --reflink=auto --sparse=alwayspara não usar espaço para a cópia, dependendo do FS subjacente.
Tom Hale
1

Faça diff old_dir new_dir > diff.txtdiferenças lado a lado no mesmo servidor.

Para arquivos remotos:

Por exemplo: ABC é um servidor existente e XYZ é o servidor remoto e o nome do diretório é 123.

Etapa 1: renomeie o diretório existente 123 no ABC Server como 123_ABC.

ABC:/Home > mv 123 123_ABC

Etapa 2: Crie um novo diretório no servidor ABC:

ABC: > mkdir 123_XYZ

Etapa 3: Copie todos os arquivos do diretório 123 no servidor XYZ para o diretório 123_XYZ no servidor ABC:

XYZ/123 > scp * userid@ABC: /123_XYZ

Isso copiará todos os arquivos do diretório em seu servidor XYZ para o diretório / 123_XYZ do servidor ABC.

Etapa: 4: Faça a diferença entre os dois diretórios:

Agora vá para o servidor ABC e execute diff entre 123_ABC e 123_XYZ

ABC > diff 123_ABC 123_XYZ > diff.txt

O comando acima salvará os resultados do diff em diff.txt no mesmo caminho.

Você pode comparar as diferenças então.

Obrigado,

Mehul

mehul
fonte
0

O AIDE ( Advanced Intrusion Detection Environment) do AIDE é um verificador de integridade de arquivos para sistemas operacionais UNIX. Seu objetivo é fornecer relatórios sobre a integridade dos dados nos sistemas de arquivos suportados. Ao executar o AIDE várias vezes no host de destino, você pode determinar quais arquivos estão sendo alterados. Ao executar o AIDE várias vezes em hosts diferentes, você pode determinar quais arquivos e permissões são diferentes. Em seguida, use uma ferramenta gui diff nos arquivos "diferentes" relatados.

Ou use uma ferramenta gui diff como meld, guiffy, kdiff3, diff, vimdiff, gvimdiff, Emacs, Kompare, Diffuse, Easydiff, TkDiff ou xxdiff. A maioria fará diferenças de diretório, além de diferenças de arquivo. Você precisará montar a unidade remota usando NFS, SMBFS ou SSHFS, como já mencionado.


fonte
0

Ou você pode usar dois arquivos com a lista de arquivos disponíveis. E então compare esses dois arquivos. Por exemplo:

/path/to/compare/remote$: ls > remote-files 

/path/to/compare/local$: ls > local-files 

Faça o download de um dos arquivos.

-rw-r - r-- 1 1015 1015 26624 2005-06-14 13:10 FILE.TXT  

para FILE.TXT

Use diff ( diff -y remote-files local-files > diff-files) para compará-los lado a lado. Abra os arquivos diff e verifique. Cada linha com> significa um arquivo diferente.

Mark Henderson
fonte