Como posso confirmar facilmente no Linux que dois diretórios separados têm exatamente o mesmo conteúdo?

8

CentOS 5.x

Mq pergunta parecia semelhante a este, mas eu não tinha certeza ...

Eu tenho dois servidores (completamente isolados um do outro), cada um com um diretório e subdiretórios que devem ter o mesmo conteúdo exato.

Por exemplo, o layout do diretório pode ser algo como:

SERVIDOR A -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

SERVIDOR B -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

Idealmente, eu gostaria de uma maneira de fazer uma verificação recursiva e ter algo para confirmar que tudo corresponde.

Também quero evitar o uso de ferramentas de terceiros.

Alguma ideia?

Mike B
fonte
Você está apenas querendo comparar os dois diretórios ou transformar um em duplicado?
Scott Pack
@ScottPack Ótima pergunta. Quero comparar, mas NÃO faço alterações. Outra coisa é lidar com a replicação dos diretórios. Eu só quero ter certeza de que está fazendo o seu trabalho.
Mike B
1
Você já marcou esta pergunta rsync? Então ... uhm, use rsync(com -nopção)?
Faker #
@faker Eu pensei que o rsync poderia ser a opção, mas não tinha certeza se havia algo melhor, mais fácil ou mais específico para esse caso de uso. Eu preciso saber que os nomes de arquivos, data, tamanho e local relativo correspondem.
Mike B
nota que o rsync não verifica o conteúdo do arquivo se o tempo e combinar tamanho, consulte a opção --checksum se isso o preocupa
guisado

Respostas:

9

Uma boa maneira é usar o md5sums em todos os arquivos da árvore:

Execute isso no server1:

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server1.tx

Execute isso no server2

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server2.tx

Em seguida, basta comparar os dois arquivos (usando diff) ou o que quiser.

É isso que você procura?

Obviamente, você pode usar o SSH para apenas executar o comando remotamente, se desejar.

Camden S.
fonte
Obrigado Camden. Sim, acho que era isso que eu estava procurando. Vou testá-lo e ver se dá certo.
Mike B
2
Ou md5sum os md5sums
dmourati
Excelente - certo, se você não se importa em saber quais arquivos são alterados, basta MD5sumir os arquivos resultantes e comparar essas duas somas.
Camden S.
Além disso, você provavelmente já sabe disso, mas para executar esse comando remotamente por SSH, você tinha acabado de fazerssh user@servera 'find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum'
Camden S.
1
MikeB, executando uma listagem longa recursiva e passando para o md5sum, você receberá um md5sum da lista de diretórios, o que excluirá o conteúdo dos arquivos. Se os tamanhos dos inodes nos sistemas de arquivos de ambos os lados forem diferentes, também poderá criar uma diferença nos tamanhos dos arquivos. Fazendo um md5sum no conteúdo, como originalmente sugerido por @CamdenS. é melhor.
Nearora
7

Se você não se importa necessariamente com o que mudou, apenas que algo mudou, o rsync ainda é realmente bom para isso. Tente executar este comando e dê uma olhada na saída, assumindo que isso seja executado em 'servera'.

rsync -avcn /opt/foo/ serverb:/opt/foo

A lista resultante será aqueles arquivos que teriam sido modificados se você realmente executasse o processo de sincronização. Lembre-se de que os arquivos aparecerão na lista mesmo que apenas o carimbo de data e hora tenha sido alterado, mas o conteúdo permaneça o mesmo. Como adicionamos o -nsinalizador, nenhuma ação será executada, apenas relatada.

Scott Pack
fonte
Obrigado. E se as duas caixas estiverem completamente isoladas uma da outra? Como posso usar a saída para comparar?
Mike B
O rsync não suporta tanto a origem eo destino a ser remoto, então ele terá que executá-lo fora de um de seus servidores
faker
@faker: Tenho que admitir, nunca tentei isso antes, é bom saber. Como você diz, porém, é fácil o suficiente para explicar.
Scott Pack
+1. Uso inteligente de rsync. Para estar completamente correto, no entanto, você precisa executar o procedimento rsyncnas duas direções. Ou seja, você precisa adicionar isso:rsync -avcn serverb:/opt/foo/ /opt/foo
Steven segunda-feira
5

Embora você possa hackear um script rápido que calcule hashes MD5 individuais para arquivos individuais em um diretório, a melhor maneira de fazer isso seria usar uma ferramenta chamada md5deepque calculará recursivamente os hashes de todos os arquivos em um diretório e depois produzirá para um arquivo. Em seguida, ele pode ser usado em outro diretório, usando o primeiro arquivo hash como entrada e fornecendo uma lista de arquivos diferentes entre os dois diretórios.

Então, tomando o seu exemplo, você seguiria este processo:

  1. Calcular hashes do diretório necessário no servidor A:

    md5deep -r /opt/foo/ > file_hashes.txt

  2. Copie o arquivo file_hashes.txtno servidor B para comparação.

  3. Calcule os hashes do diretório necessário no Servidor B, mas pegue os hashes de arquivo do Servidor A como um arquivo de entrada usando o -xsinalizador para mostrar apenas arquivos diferentes:

    md5deep -x file_hashes.txt -r /opt/foo/

O conjunto de ferramentas md5deep faz parte do sistema de gerenciamento de pacotes da maioria das distribuições, e o melhor é que ele suporta vários algoritmos de hash diferentes, não apenas o MD5. Portanto, se você é paranóico em relação a colisões, tem várias alternativas disponíveis. As ferramentas a seguir fazem parte do md5deep, cada uma fornecendo um algoritmo de hash alternativo:

   md5deep - Compute and compare MD5 message digests
   sha1deep - Compute and compare SHA-1 message digests
   sha256deep - Compute and compare SHA-256 message digests
   tigerdeep - Compute and compare Tiger message digests
   whirlpooldeep - Compute and compare Whirlpool message digests
Richard Keller
fonte
0

Eu usei uma técnica semelhante ao @ scott-pack. Isso mostrará as diferenças bidirecionais. Tudo o que começa com "exclusão" é um arquivo que está no servidor remoto, mas não no servidor local. Todo diretório listado sem nenhum conteúdo de arquivo é aquele que não possui alterações. Todo arquivo listado é um arquivo que não existe no servidor remoto ou a versão local é "mais recente".

rsync -rvnac --delete /local/directory/ user@remote:/remote/directory/
David Baucum
fonte