Calcola checksum MD5 di una directory


29

Sto cercando un modo rapido per confrontare i contenuti della directory. È possibile eseguire un md5sum (o checksum equivalente) di un'intera directory?

Usando Ubuntu Linux


Potresti anche voler esaminare l'uso di diff per confrontare le directory che ti mostreranno effettivamente dove differiscono le directory. unixtutorial.org/2008/06/how-to-compare-directories-in-unix
Kibbee

@Kibbee Per evitare ciò, è necessario prendere in considerazione qualcosa di diverso dal contenuto dei dati di ciascun file e esattamente come si fa il checksum dei file. Dato: [checksum] 1. A (Directory) - File1 [ABC] - File2 [CBA] 2. B (Directory) - File1 [ABC] - B1 (Directory) - File2 [CBA] 3. C (Directory) - File4 [ABC] - File5 [CBA] 4. D (Directory) - Copia file1 [ABC] - Copia file2 [CBA] Le directory A e B non sono identiche sebbene contengano gli stessi file (sebbene in B1 , File2 sia in una sottodirectory) . Sotto il tuo esempio, A e C sarebbero considerati identici perché
Jacob Lyles,

Risposte:


36

Sicuro - md5sum directory/*

Se hai bisogno di qualcosa di un po 'più flessibile (ad esempio, per la ricorsione della directory o il confronto hash), prova md5deep.

apt-get install md5deep
md5deep -r directory

Per confrontare una struttura di directory, puoi dargli un elenco di hash da confrontare con:

md5deep -r -s /directory1 > dir1hashes
md5deep -r -X dir1hashes /directory2

Ciò produrrà tutti i file nella directory2 che non corrispondono alla directory1.

Questo non mostrerà i file che sono stati rimossi dalla directory1 o i file che sono stati aggiunti alla directory2.


Non quello che volevo dire, ma quello che volevo :) Volevo dire ricorsivamente, e ottenere UN hash alla fine, ma penso che ciò possa essere fatto con md5deep -l e hashing dell'output stesso.
pesce palla

1
L'ordine dell'hash non è coerente, quindi dovrebbe ordinare l'output prima dell'hash
pesce palla

1
Per ottenere un ordine deterministico, usa ciò -j0che disabilita il multithreading (vedi la pagina man).
Johann,

1
@ ShaneMadden ♦ Ho installato md5deepcon sudo apt-get install md5deepon Ubuntu 16.04ma quando ho provato a leggere la pagina man mi ha detto che> Nessuna voce manuale per md5deep
Kasun Siyambalapitiya

27

Se vuoi vedere cosa c'è di diverso (se non altro) tra due directory, rsync sarebbe una buona scelta.

rsync --archive --dry-run --checksum --verbose /source/directory/ /destination/directory

Questo elencherà tutti i file che sono diversi.


2
diff -qr /source/directory/ /destination/directory/mostrerebbe anche file diversi.
Konerak,

C'è un modo per eseguire un confronto bit a bit anziché i checksum? Potrebbe essere più veloce su unità locali.
Ali,

Molto bella. Funziona se l'origine o la destinazione sono anche cartelle remote, ad es.username@hostname:/destination/directory
Thalis K.

11

penso di aver risposto a questo prima con questa risposta:

find . -xtype f -print0 | xargs -0 sha1sum | cut -b-40 | sort | sha1sum

dà: b1a5b654afee985d5daccd42d41e19b2877d66b1

l'idea è di eseguire l'hashing di tutti i file ritagliare gli hash uno per riga, ordinarli e hash che producono un singolo hash. questo non dipende dai nomi dei file.


5

L' applicazione cfv è abbastanza utile, non solo può controllare e creare checksum MD5, ma può anche fare CRC32, sha1, torrent, par, par2.

per creare un file checksum CRC32 per tutti i file nella directory corrente:

cfv -C

per creare un file checksum MD5 per tutti i file nella directory corrente:

cfv -C -t md5 -f "directory corrente.md5sums"

Per creare un file checksum separato per ogni sottodirectory:

cfv -C -r

Per creare un file di checksum "super" contenente file in tutte le sottodirectory:

cfv -C -rr

4

Ho usato l'hashdeep, come spiegato in questa risposta askubuntu: Verifica la correttezza dei file copiati :

Per calcolare i checksum:

 $ cd <directory1>
 $ hashdeep -rlc md5 . > ~/hashOutput.txt

Per verificare ed elencare le differenze:

 $ cd <directory2>
 $ hashdeep -ravvl -k ~/hashOutput.txt .
 hashdeep: Audit passed
    Input files examined: 0
   Known files expecting: 0
           Files matched: 13770
 Files partially matched: 0
             Files moved: 0
         New files found: 0
   Known files not found: 0

Questo ha un vantaggio rispetto a md5deep in quanto mostrerà i file rinominati (spostati), aggiunti e rimossi, oltre a evitare il problema con i file di lunghezza 0 indicati in fondo a http://www.meridiandiscovery.com/how- a / validating-copy-results-using-md5deep .


3

Questo ha funzionato per me: (eseguilo nella directory che ti interessa)

md5deep -rl . | awk '{print $1}' | sort -n | md5sum

1

È possibile creare somme MD5 di ogni singolo file, ordinare questi checksum in ordine alfabetico e averli (con o senza newline). Poiché MD5 è crittografico, dovrebbe funzionare perfettamente con gli hash degli hash.

Dovrebbe esserci un certo ordine per le cose, altrimenti otterrai risultati diversi per directory uguali.

E si dovrebbe considerare che l'aggiunta di alcuni file in una directory cambierà completamente il risultato, anche se era solo un .directorydi .DS_Storefile.


Tecnicamente si potrebbe ottenere lo stesso hash per directory diverse. Se dir A avesse 2 file con i contenuti 'ab' e 'c' e dir B avesse 2 file con i contenuti 'a' e 'bc', l'hashing solo i dati nei file produrrebbe gli stessi risultati, anche se hanno file con contenuti diversi. Non sono nemmeno sicuro di come definire MD5Sum di una directory.
Kibbee,

1

Come caso specifico, supponiamo che tu voglia copiare alcuni file da directory1 a directory2 e quindi vuoi verificare una copia corretta usando un confronto md5.

Primo. cd in directory1 e digitare:

find -type f -exec md5sum "{}" \; > ~/Desktop/md5sum.txt

che creerà un file di riferimento contenente una somma md5 per ciascun file nella directory1. Una volta fatto, tutto ciò che devi fare è cd in directory2 e digitare:

md5sum -c ~/Desktop/md5sum.txt

Il programma md5sum recupera ogni percorso dal file md5sum.txt, calcola il md5sum di quel file nella cartella di destinazione e poi lo confronta con la somma che ha archiviato nel file.

Una volta completato il processo, otterrai un riepilogo del tipo "Così tanti file non corrispondono" o qualcosa del genere.



1

Ho avuto la necessità di verificare l'integrità dei backup / mirror che contengono un gran numero di file e ho finito per scrivere un programma da riga di comando chiamato MassHash. È scritto in Python. È anche disponibile un GTK + Launcher. Potresti volerlo controllare...

http://code.google.com/p/masshash/

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.