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

8

CentOS 5.x

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

Eu tenho dois servidores (completamente isolados uns dos outros), 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 confirmando que tudo corresponde.

Eu também quero evitar o uso de ferramentas de terceiros.

Alguma ideia?

    
por Mike B 18.05.2012 / 22:43

4 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 isto 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 você quiser.

Isso está de acordo com o que você está procurando?

Claro, você pode usar o SSH para executar o comando remotamente, se quiser.

    
por 18.05.2012 / 23:25
7

Se você não se importa necessariamente com o que mudou, apenas algo mudou, o rsync ainda é muito bom para isso. Tente executar este comando e dê uma olhada na saída, assumindo que isso é executado a partir de '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. Tendo em mente que os arquivos aparecerão na lista mesmo que apenas o registro de data e hora seja alterado, mas o conteúdo permaneça o mesmo. Como adicionamos o sinalizador -n , nenhuma ação será realmente executada, apenas relatada.

    
por 18.05.2012 / 22:58
5

Embora você possa criar 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 md5deep , que calculará recursivamente os hashes de todos os arquivos em um diretório e, em seguida, imprimi-los em um arquivo. Ele pode então ser usado em outro diretório, pegando o primeiro arquivo de hash como entrada e fornecendo uma lista de arquivos diferentes entre os dois diretórios.

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

  1. Calcule os hashes do diretório necessário no Servidor A:

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

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

  3. Calcule hashes do diretório necessário no Servidor B, mas levando os hashes de arquivo do Servidor A como um arquivo de entrada usando o sinalizador -x 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 distros, e o melhor é que ele suporta vários algoritmos de hash diferentes, não apenas o MD5. Então, se você é paranóico sobre colisões, você tem várias alternativas disponíveis. As seguintes ferramentas fazem parte do md5deep, cada uma fornecendo um algoritmo alternativo de hash:

   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
    
por 01.06.2012 / 00:50
0

Eu usei uma técnica parecida com o @ scott-pack. Isso dirá para você um diff bidirecional. Tudo o que começa com "excluir" é um arquivo que está no servidor remoto, mas não no servidor local. Todo diretório listado sem qualquer conteúdo de arquivo é aquele que não tem 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/
    
por 12.08.2013 / 20:41