C'è MD5 (o simile) in una cartella? Come verificare se due cartelle sono uguali?


10

Vorrei trovare un md5sum(o un calcolo simile) di una cartella senza comprimerlo in un archivio.

Ad esempio, se nella cartella MyFolderche abbiamo i file 1.txt, 2.txte 3.txt, contenente:


1.txt

Il testo in 1.txt

2.txt

Il testo in 2.txt

3.txt

Il testo in 3.txt


Come posso calcolare il md5sumtotale MyFolder? C'è un modo? Voglio usarlo per verificare se due cartelle hanno lo stesso contenuto.

Questo può essere utile per verificare se due cd o cartelle sono uguali. Vorrei un modo semplice per farlo.

Risposte:


15

Lo strumento md5deep è stato sviluppato proprio per questo scopo. Molte distribuzioni Linux lo offrono in forma di pacchetto.


1
Grazie! Ha funzionato bene per me. Ad altri utenti con lo stesso problema piace questo: sudo apt-get install md5deep md5deep -rel /path/to/your/directory/ > directory_hash.md5 md5deep -X directory_hash.md5 -r /path/to/your/second/direcotory Grazie mille.
GarouDan,

@GarouDan. Il comando che hai mostrato seguirà i collegamenti simbolici. È possibile utilizzare l' -oopzione per gestire i tipi di file.
Peter.O

Oh grazie ... non lo so ... davvero utile. Mi ricorderò!
GarouDan,

4

Se non vuoi archiviarlo, forse potresti fare qualcosa del genere

diff <(find folder1) <(find folder2)

Potrebbe essere necessario adattare i findcomandi per essere più accurati.

MODIFICA È possibile aggiungere -execalla chiamata di ricerca per confrontare il contenuto dei file. Qualcosa di simile a questo:

diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)

Ricorda che potresti voler adattare questo.


È un punto interessante. Questo elenca tutti i file di ogni cartella ... ma se ho davvero una grande quantità di archivi ... come posso verificare che ci siano gli stessi file (con i dati - magari usando uno strumento md5sum) in ogni cartella?
GarouDan,

1
Quindi esegui una diff dell'output MD5SUM di ciascun file. Devi solo mettere insieme i comandi find, md5sum e diff in modo diverso.
sybreon,

Grazie anche per le tue idee, cya ... Proverò cose interessanti con questi comandi di ricerca dopo ... grazie.
GarouDan,

3

Un modo per testare potrebbe essere quello di generare un md5sum basato sulla concatenazione di tutti i file nella cartella e nelle sue sottocartelle. Tenere presente che ciò richiede anche che i file abbiano gli stessi nomi (in quanto devono essere nello stesso ordinamento). Il seguente codice dovrebbe funzionare:

#!/bin/bash

shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }

for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done

(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }

_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)

{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }

Se ti interessano davvero i nomi dei file, ecc., Potresti usare un ciclo per confrontare ciò che è in ${_files_in_old_dir}e ${_files_in_new_dir}. Questo dovrebbe funzionare nella maggior parte dei casi (controlla almeno il numero di file nella directory e nelle sue sottodirectory).


Questa è una bella sceneggiatura ... grazie a Chris. Ma ha un problema ... usando cat , le sottocartelle si bloccano con errori ... Hai un'idea per risolverlo? Grazie mille.
GarouDan,

Funziona bene per me. Assicurati che la tua shell supporti globstar. Qual è l'errore?
Chris Down,

1
Funziona "(+1) ... ma globstar in bash 4 segue i collegamenti simbolici della directory , ma questo è solo un problema se una delle directory contiene un collegamento simbolico.
Peter

@fered Buona chiamata, ho aggiunto in un test.
Chris Down,

0

Ho notato che il post originale è piuttosto vecchio, tuttavia, penso che queste informazioni possano comunque essere utili per coloro che cercano una soluzione per verificare che i file vengano copiati correttamente. Rsync potrebbe essere il metodo migliore per copiare dati e le risposte fornite in questo thread sono buone, tuttavia per coloro che non hanno esperienza con Linux, proverò a fornire una spiegazione più dettagliata.

Scenario: hai appena copiato i dati da un disco a un altro, con molte sottodirectory e file. Si desidera verificare che tutti i dati siano stati copiati correttamente.

Verificare innanzitutto che md5deep sia installato eseguendo il comando md5deep -v.

Se ricevi un messaggio che dice qualcosa come "comando non trovato", installa md5deep apt-get install md5deep.

Si presume che tu voglia gestire solo i file normali. Se si desidera gestire altri tipi di file, fare riferimento al flag -o nel manuale md5deep. ( man md5deep)

Ora sei a posto e supponiamo che tu abbia copiato i file da /mnt/orginala /mnt/backup, sostituirli con tutte le directory che stai utilizzando.

Prima modifica alla directory di origine, questa è l'origine originale per i file copiati o sottoposti a backup:

cd /mnt/orginal

Quindi crea un checksum per ogni file:

md5deep -rel -o f . >> /tmp/checksums.md5

Questo comando ha spiegato:

-r abilita la modalità ricorsiva

-e visualizza l'indicatore di avanzamento

-l abilita i percorsi dei file relativi.

-o f funziona solo su file regolari (non bloccare dispositivi, named pipe ecc.)

. dice a md5deep di avviarsi nella directory corrente.

>> /tmp/checksums.md5dice a md5deep di reindirizzare tutto l'output a /tmp/checksums.md5.

Nota, se si desidera sovrascrivere il contenuto nelle versioni precedenti di /tmp/checksums.md5, utilizzare >e non>>

Si noti che questo comando potrebbe richiedere del tempo, a seconda della velocità io e della dimensione dei dati. Potresti sperimentare nice e / o ionice per aumentare le prestazioni di md5deep, ma questo non rientra nell'ambito di questa risposta.

Al termine della creazione delle somme di controllo, ora hai un file con voci simili a:

69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f3c7f79a14332f9fa7bb368039210 ./oldconfig-11-09-2013/etc2/78c01fdc78 /etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.cache

La prima colonna è la somma di controllo md5 e la seconda colonna è il percorso relativo al file a cui appartiene il checksum.

Se vuoi vedere quanti file esistono nel file checksum, emetti il ​​comando:

wc /tmp/checksums.md5 -l

Ora, vuoi verificare che i dati copiati siano corretti:

cd /mnt/backup

md5deep -o f -reX /tmp/checksums.md5 . >> /tmp/compare.result

L'unica differenza rispetto a quando abbiamo creato i checksum è -X che visualizza l'hash corrente di un file se la voce nel file checksums.md5 non corrisponde. Quindi alla fine del test, se /tmp/compare.resultè vuoto, puoi fidarti che tutti i file vengono copiati correttamente poiché il checksum corrisponde.

Nota che solo i file elencati nel /tmp/checksums.md5file verranno controllati per un checksum corretto, se ci sono altri file nella /mnt/backupdirectory, md5deep non ti avviserà di questi.

Appunti:

  • Non è necessario utilizzare il reindirizzamento per archiviare i file di output. Fare riferimento al manuale di md5deep per ulteriori informazioni.

  • Potrebbe essere necessario eseguire i comandi md5deep come root, a seconda delle autorizzazioni dei file che si stanno gestendo.


0

Se si desidera verificare ricorsivamente le differenze tra due directory /path1e /path2 senza usare md5deep:

diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)

Spiegazione:

  • ottenuto path1per rendere tutte le linee stampate da findessere relative a path1( cd /path1)
  • elenca tutti i file in modo ricorsivo nel percorso corrente ( && find . -type f)
  • usa ogni uscita di linea findcome input per md5( | xargs md5)

L'output sarà simile a questo se ci sono differenze:

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
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.