Come posso facilmente confermare in Linux che due directory separate hanno esattamente lo stesso contenuto?


8

CentOS 5.x

La domanda Mq sembrava simile a questa ma non ero sicuro ...

Ho due server (completamente isolati l'uno dall'altro), ognuno con una directory e sottodirectory che dovrebbero avere lo stesso contenuto esatto.

Ad esempio, il layout della directory potrebbe essere simile a:

SERVER 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

SERVER 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 mi piacerebbe un modo per fare un controllo ricorsivo e avere qualcosa che confermi che tutto corrisponde.

Voglio anche evitare di utilizzare strumenti di terze parti.

Qualche idea?


Vuoi solo confrontare le due directory o effettivamente renderne una duplicata dell'altra?
Scott Pack,

@ScottPack Ottima domanda. Voglio confrontare ma NON apportare modifiche. Qualcos'altro sta gestendo la replica delle directory. Voglio solo assicurarmi che stia facendo il suo lavoro.
Mike B,

1
Hai già taggato questa domanda rsync? Quindi ... uhm, usa rsync(con -nopzione)?
faker

@faker Pensavo che rsync potesse essere l'opzione ma non ero sicuro che ci fosse qualcosa di meglio, più facile o più specifico in questo caso d'uso. Devo sapere che i nomi dei file, la data, le dimensioni e la posizione relativa corrispondono.
Mike B,

nota che rsync non controlla il contenuto del file se il tempo e le dimensioni corrispondono, vedi l'opzione --checksum se questo ti preoccupa
stufare

Risposte:


9

Un buon modo è usare md5sums su ogni file nella struttura:

Esegui questo su server1:

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

Esegui questo su server2

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

Quindi confronta i due file (usando diff) o quello che ti piace.

È sulla falsariga di ciò che stai cercando?

Ovviamente, puoi usare SSH per eseguire il comando da remoto solo se lo desideri.


Grazie Camden. Sì, penso che sia quello che stavo cercando. Lo proverò e vedrò se funziona.
Mike B,

2
O md5sum the md5sums
dmourati,

Eccellente - giusto, se non ti interessa sapere quali file cambiano, potresti semplicemente modificare i file risultanti e confrontare queste due somme.
Camden S.

Inoltre, probabilmente lo sai già, ma per eseguire quel comando da remoto su SSH, lo faresti semplicementessh user@servera 'find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum'
Camden S.

1
MikeB, eseguendo un elenco ricorsivo lungo e passandolo a md5sum, otterrai un md5sum dell'elenco delle directory, che escluderà il contenuto dei file. Se le dimensioni degli inode nei filesystem su entrambe le estremità fossero diverse, potrebbe anche creare una differenza nelle dimensioni dei file. Fare un md5sum sul contenuto come originariamente suggerito da @CamdenS. è meglio.
Nearora,

7

Se non ti interessa necessariamente ciò che è cambiato, solo che qualcosa è cambiato, rsync è ancora davvero buono per questo. Prova a eseguire questo comando e dai un'occhiata all'output, supponendo che sia eseguito da 'servera'.

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

L'elenco risultante sarà quei file che sarebbero stati modificati se avessi effettivamente eseguito il processo di sincronizzazione. Tenendo presente che i file verranno visualizzati nell'elenco anche se solo il timestamp è cambiato, ma il contenuto è rimasto lo stesso. Da quando abbiamo aggiunto il -nflag, nessuna azione verrà effettivamente eseguita, solo segnalata.


Grazie. Cosa succede se le due caselle sono completamente isolate l'una dall'altra? Come posso usare l'output per confrontare?
Mike B,

rsync non supporta sia l'origine che la destinazione come remote, quindi dovrà eseguirlo da uno dei suoi server
faker

@faker: devo ammetterlo, mai provato prima, buono a sapersi. Come dici tu, però, è abbastanza facile spiegarlo.
Scott Pack,

+1. Uso intelligente di rsync. Per essere completamente corretto, però, devi correre rsyncin entrambe le direzioni. Cioè, è necessario aggiungere questo:rsync -avcn serverb:/opt/foo/ /opt/foo
Steven lunedì

5

Mentre potresti hackerare insieme uno script rapido che calcolerà i singoli hash MD5 per i singoli file in una directory, il modo migliore per farlo sarebbe usare uno strumento chiamato md5deepche calcolerà ricorsivamente gli hash di tutti i file in una directory, e quindi l'output li in un file. Può quindi essere utilizzato in un'altra directory, prendendo il primo file hash come input e fornendo un elenco di file diversi tra le due directory.

Quindi, prendendo il tuo esempio, seguiresti questo processo:

  1. Calcola gli hash della directory richiesta sul Server A:

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

  2. Copia il file file_hashes.txtsul server B per il confronto.

  3. Calcola gli hash della directory richiesta sul server B, ma prendendo gli hash dei file dal server A come file di input utilizzando il -xflag per mostrare solo i file diversi:

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

Il set di strumenti md5deep fa parte del sistema di gestione dei pacchetti della maggior parte delle distribuzioni, e la cosa fantastica è che supporta un numero di algoritmi di hashing diversi, non solo MD5. Quindi, se sei paranoico sulle collisioni, hai una serie di alternative disponibili. I seguenti strumenti fanno parte di md5deep, ognuno dei quali fornisce un algoritmo di hashing 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

0

Ho usato una tecnica simile a @ scott-pack. Questo ti dirà di avere una differenza bidirezionale. Tutto ciò che inizia con "l'eliminazione" è un file che si trova sul server remoto ma non sul server locale. Ogni directory elencata senza alcun contenuto di file è una senza modifiche. Ogni file elencato è un file che non esiste sul server remoto o che la versione locale è "più recente".

rsync -rvnac --delete /local/directory/ user@remote:/remote/directory/
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.