Hitung checksum MD5 dari sebuah direktori

29

Saya mencari cara cepat untuk membandingkan konten direktori. Apakah mungkin untuk melakukan md5sum (atau checksum setara) dari seluruh direktori?

Menggunakan Ubuntu Linux

ikan buntal
sumber
Anda mungkin juga ingin melihat menggunakan diff untuk membandingkan direktori yang sebenarnya akan menunjukkan kepada Anda di mana direktori berbeda. unixtutorial.org/2008/06/how-to-compare-directories-in-unix
Kibbee
@Bibbee Untuk mencegah hal itu, Anda perlu mempertimbangkan sesuatu selain konten data dari setiap file dan bagaimana tepatnya Anda memeriksa file-file tersebut. Diberikan: [checksum] 1. A (Direktori) - File1 [ABC] - File2 [CBA] 2. B (Direktori) - File1 [ABC] - B1 (Direktori) - File2 [CBA] 3. C (Direktori) - File4 [ABC] - File5 [CBA] 4. D (Direktori) - Salinan File1 [ABC] - Salinan File2 [CBA] Direktori A dan B tidak identik meskipun mengandung file yang sama (meskipun dalam B1 , File2 berada dalam subdirektori) . Dalam contoh Anda, A dan C akan dianggap identik karena
Jacob Lyles

Jawaban:

36

Yakin - md5sum directory/*

Jika Anda memerlukan sesuatu yang sedikit lebih fleksibel (misalnya, untuk rekursi direktori atau perbandingan hash), coba md5deep.

apt-get install md5deep
md5deep -r directory

Untuk membandingkan struktur direktori, Anda dapat memberikan daftar hash untuk dibandingkan dengan:

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

Ini akan menampilkan semua file dalam direktori2 yang tidak cocok dengan direktori1.

Ini tidak akan menampilkan file yang telah dihapus dari direktori1 atau file yang telah ditambahkan ke direktori2.

Shane Madden
sumber
Bukan apa yang saya maksudkan, tapi apa yang saya inginkan :) Saya maksudkan secara rekursif, dan mendapatkan SATU hash pada akhirnya, tapi saya pikir ini bisa dilakukan dengan md5deep -l dan hashing output itu sendiri.
ikan buntal
1
Urutan hashing tidak konsisten, jadi harus mengurutkan output sebelum hashing
buntal
1
Untuk mendapatkan urutan deterministik, gunakan -j0yang menonaktifkan multithreading (lihat halaman manual).
Johann
1
@ ShaneMadden ♦ saya diinstal md5deepdengan sudo apt-get install md5deepdi Ubuntu 16.04tetapi ketika saya mencoba untuk membaca halaman manual ini memberitahu saya bahwa> ada entri manual untuk md5deep
Kasun Siyambalapitiya
27

Jika Anda ingin melihat apa yang berbeda (jika ada) antara dua direktori, rsync akan cocok.

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

Ini akan mencantumkan file yang berbeda.

JakePaulus
sumber
2
diff -qr /source/directory/ /destination/directory/juga akan menampilkan file yang berbeda.
Konerak
Apakah ada cara untuk melakukan perbandingan bitwise daripada checksum? Mungkin lebih cepat pada drive lokal.
Ali
Sangat bagus. Berfungsi jika sumber atau tujuan juga folder jarak jauh misalnyausername@hostname:/destination/directory
Thalis K.
11

saya pikir saya menjawab yang ini sebelumnya dengan jawaban ini:

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

memberi: b1a5b654afee985d5daccd42d41e19b2877d66b1

Idenya adalah Anda hash semua file memotong hash satu per baris, urutkan mereka dan hash yang menghasilkan hash tunggal. ini tidak tergantung pada nama file.

Dan D.
sumber
5

The cfv aplikasi yang cukup berguna, tidak hanya dapat memeriksa dan membuat MD5 checksum, juga dapat melakukan CRC32, sha1, torrent, par, par2.

untuk membuat file checksum CRC32 untuk semua file di direktori saat ini:

cfv -C

untuk membuat file checksum MD5 untuk semua file di direktori saat ini:

cfv -C -t md5 -f "direktori saat ini.md5sums"

Untuk membuat file checksum terpisah untuk setiap sub direktori:

cfv -C -r

Untuk membuat file checksum "super" yang berisi file di semua sub direktori:

cfv -C -rr
Hubert Kario
sumber
4

Saya menggunakan hashdeep, seperti yang dijelaskan dalam jawaban askubuntu ini: Periksa kebenaran file yang disalin :

Untuk menghitung checksum:

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

Untuk memverifikasi dan mendaftar perbedaan:

 $ 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

Ini memiliki keunggulan dibandingkan md5deep karena ia akan menunjukkan nama diubah (dipindahkan), ditambahkan, dan dihapus file, serta menghindari masalah dengan 0 file panjang yang ditunjukkan di bagian bawah http://www.meridiandiscovery.com/how- ke / memvalidasi-menyalin-hasil-menggunakan-md5deep .

Argyle
sumber
3

Ini bekerja untuk saya: (jalankan ketika berada di direktori yang Anda minati)

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

Anda dapat membuat jumlah MD5 dari setiap file tunggal, memesan checksum ini menurut abjad dan memilikinya (dengan atau tanpa baris baru). Karena MD5 adalah kriptografi, ia harus bekerja dengan baik dengan hash hash.

Harus ada urutan tertentu untuk beberapa hal, jika tidak, Anda akan mendapatkan hasil berbeda untuk dir yang sama.

Dan Anda harus mempertimbangkan bahwa menambahkan beberapa berkas untuk satu dir benar-benar akan mengubah hasilnya, bahkan jika itu hanya .directorydari .DS_Storeberkas.

Martin Ueding
sumber
Secara teknis orang bisa mendapatkan hash yang sama untuk direktori yang berbeda. Jika dir A memiliki 2 file dengan isi 'ab' dan 'c' dan dir B memiliki 2 file dengan konten 'a' dan 'bc' maka hashing hanya data dalam file akan menghasilkan hasil yang sama, meskipun mereka memiliki file dengan isinya berbeda. Saya bahkan tidak yakin bagaimana seseorang akan mendefinisikan MD5Sum direktori.
Kibbee
1

Sebagai kasus tertentu, katakanlah Anda ingin menyalin beberapa file dari direktori1 ke direktori2 dan kemudian Anda ingin memverifikasi salinan yang berhasil menggunakan perbandingan md5.

Pertama. cd ke directory1 dan ketik:

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

yang akan membuat file referensi yang berisi jumlah md5 untuk setiap file di direktori1. Setelah ini selesai, yang harus Anda lakukan adalah cd ke directory2 dan ketik:

md5sum -c ~/Desktop/md5sum.txt

Program md5sum mengambil setiap jalur dari file md5sum.txt, menghitung md5sum dari file itu di folder tujuan dan kemudian membandingkannya dengan jumlah yang telah disimpan dalam file tersebut.

Setelah proses selesai, Anda akan mendapatkan ringkasan seperti 'Begitu dan begitu banyak file yang tidak cocok' atau semacamnya.

Joel
sumber
1

Saya memiliki kebutuhan untuk memverifikasi integritas cadangan / mirror yang berisi sejumlah besar file dan akhirnya menulis program baris perintah yang disebut MassHash. Itu ditulis dalam Python. Peluncur GTK + juga tersedia. Mungkin kamu ingin memeriksanya...

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

Jonathan
sumber