Apakah ada MD5 (atau serupa) ke folder? Bagaimana cara memverifikasi jika dua folder sama?

10

Saya ingin menemukan md5sum(atau perhitungan serupa) dari folder tanpa mengompresnya menjadi arsip.

Misalnya, jika dalam folder MyFolderkita memiliki file 1.txt, 2.txtdan 3.txt, berisi:


1.txt

Teks menjadi 1.txt

2.txt

Teks menjadi 2.txt

3.txt

Teks menjadi 3.txt


Bagaimana saya bisa menghitung md5sumkeseluruhan ini MyFolder? Apakah ada cara? Saya ingin menggunakan ini untuk memverifikasi apakah dua folder memiliki konten yang sama.

Ini dapat digunakan untuk memverifikasi apakah dua CD atau folder sama. Saya ingin cara mudah untuk melakukannya.

GarouDan
sumber

Jawaban:

15

Alat md5deep dikembangkan untuk tujuan ini. Banyak distribusi Linux menawarkannya dalam bentuk paket.

David Schwartz
sumber
1
Terima kasih! Ini bekerja dengan baik untuk saya. Untuk pengguna lain dengan masalah yang sama untuk menyukai ini: Terima kasih 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 banyak.
GarouDan
@ GarouDan. Perintah yang Anda tunjukkan akan mengikuti tautan simbolik. Anda dapat menggunakan -oopsi untuk menangani jenis file.
Peter.O
Oh thx ... tidak tahu itu ... sangat membantu. Saya akan ingat!
GarouDan
4

Jika Anda tidak ingin mengarsipkannya, mungkin Anda bisa melakukan sesuatu seperti ini

diff <(find folder1) <(find folder2)

Anda mungkin harus menyesuaikan findperintah agar lebih akurat.

EDIT Anda dapat menambah -execpanggilan pencarian Anda untuk membandingkan konten file. Sesuatu yang mirip dengan ini:

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

Ingatlah bahwa Anda mungkin ingin menyesuaikan ini.

rahmu
sumber
Ini poin yang menarik. Ini mencantumkan semua file dari setiap folder ... tetapi jika saya memiliki jumlah arsip yang sangat besar ... bagaimana bisa memverifikasi ada file yang sama (dengan data - mungkin menggunakan alat md5sum) di setiap folder?
GarouDan
1
Kemudian lakukan perbedaan dari output MD5SUM dari setiap file. Anda hanya perlu merangkai perintah find, md5sum, dan diff secara berbeda.
sybreon
Terima kasih juga tentang ide-ide Anda, cya ... Saya akan mencoba hal-hal menarik dengan perintah menemukan ini setelah ... terima kasih.
GarouDan
3

Salah satu cara untuk menguji bisa dengan menghasilkan md5sum berdasarkan gabungan semua file dalam folder dan subfoldernya. Ingatlah bahwa ini juga mengharuskan file memiliki nama yang sama (karena harus dalam urutan yang sama). Kode berikut harus berfungsi:

#!/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 ; }

Jika Anda benar-benar peduli dengan nama file, dll, Anda bisa menggunakan loop untuk membandingkan apa yang ada dalam ${_files_in_old_dir}dan ${_files_in_new_dir}. Ini harus bekerja untuk sebagian besar kasus (setidaknya memeriksa jumlah file dalam direktori dan subdirektori).

Chris Down
sumber
Ini skrip yang bagus ... thx @Chris. Tapi ada masalah ... menggunakan kucing , subfolder macet dengan kesalahan ... Apakah Anda punya ide untuk menyelesaikannya? Terima kasih banyak.
GarouDan
Ini bekerja dengan baik untuk saya. Pastikan cangkang Anda mendukung globstar. Apa kesalahannya?
Chris Down
1
Itu "berfungsi" (+1) ... tetapi globstar di bash 4 mengikuti symlink direktori , tetapi itu hanya masalah jika direktori mana pun mengandung symlink.
Peter.O
@ memberikan Panggilan yang bagus, saya menambahkan dalam sebuah tes.
Chris Down
0

Saya perhatikan bahwa tulisan aslinya agak lama, namun, saya pikir informasi ini masih dapat bermanfaat bagi mereka yang mencari solusi untuk memverifikasi bahwa file disalin dengan benar. Rsync mungkin merupakan metode terbaik untuk menyalin data dan jawaban yang diberikan di utas ini bagus, namun bagi mereka yang tidak berpengalaman dengan Linux, saya akan mencoba memberikan penjelasan yang lebih rinci.

Skenario: Anda baru saja menyalin data dari disk ke disk lain, dengan banyak subdirektori dan file. Anda ingin memverifikasi bahwa semua data disalin dengan benar.

Pertama, periksa apakah md5deep diinstal dengan mengeluarkan perintah md5deep -v.

Jika Anda mendapatkan pesan yang mengatakan sesuatu seperti 'perintah tidak ditemukan', maka instal md5deep oleh apt-get install md5deep.

Diasumsikan Anda hanya ingin berurusan dengan file biasa. Jika Anda ingin menangani jenis file lain, lihat -o flag di manual md5deep. ( man md5deep)

Sekarang Anda baik untuk pergi, dan kami berasumsi bahwa Anda menyalin file dari /mnt/orginalke /mnt/backup, gantikan ini dengan direktori yang Anda gunakan.

Perubahan pertama ke direktori sumber, ini adalah sumber asli untuk file yang Anda salin atau cadangkan:

cd /mnt/orginal

Kemudian buat sebuah checksum dari setiap file:

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

Perintah ini menjelaskan:

-r memungkinkan mode rekursif

-e menampilkan indikator progres

-l memungkinkan jalur file relatif.

-o f hanya bekerja pada file biasa (tidak memblokir perangkat, pipa bernama dll.)

. memberitahu md5deep untuk memulai di direktori saat ini.

>> /tmp/checksums.md5memberitahu md5deep untuk mengalihkan semua output ke /tmp/checksums.md5.

Catatan, jika Anda ingin menimpa konten di versi sebelumnya /tmp/checksums.md5, gunakan >dan tidak>>

Perhatikan bahwa perintah ini bisa memakan waktu cukup lama, tergantung pada kecepatan io dan ukuran data. Anda dapat bereksperimen dengan ion bagus dan / atau untuk meningkatkan kinerja md5deep, tapi itu di luar cakupan jawaban ini.

Ketika pembuatan jumlah cek telah selesai, Anda sekarang memiliki file yang memiliki entri yang mirip dengan:

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

Kolom pertama adalah jumlah cek md5, dan kolom kedua adalah jalur relatif ke file milik checksum.

Jika Anda ingin melihat berapa banyak file yang ada di file checksum, jalankan perintah:

wc /tmp/checksums.md5 -l

Sekarang, Anda ingin memeriksa apakah data yang disalin sudah benar:

cd /mnt/backup

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

Satu-satunya perbedaan dari saat kami membuat checksum adalah -X yang menampilkan hash file saat ini jika entri dalam file checksums.md5 tidak cocok. Jadi pada akhir tes, jika /tmp/compare.resultkosong, Anda dapat percaya bahwa semua file disalin dengan benar sejak checksum cocok.

Perhatikan bahwa hanya file yang terdaftar dalam /tmp/checksums.md5file yang akan diperiksa untuk checksum yang benar, jika ada file tambahan dalam /mnt/backupdirektori, md5deep tidak akan memberi tahu Anda tentang ini.

Catatan:

  • Anda tidak perlu harus menggunakan pengalihan untuk menyimpan file output. Lihat manual md5deep untuk informasi lebih lanjut.

  • Anda mungkin harus menjalankan perintah md5deep sebagai root, tergantung pada izin file yang Anda tangani.

NordicViking
sumber
0

Jika Anda ingin memeriksa secara rekursif perbedaan antara dua direktori /path1dan /path2 tanpa menggunakan md5deep:

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

Penjelasan:

  • masuk ke path1untuk membuat semua baris dicetak oleh findmenjadi relatif terhadap path1( cd /path1)
  • daftar semua file secara rekursif di jalur saat ini ( && find . -type f)
  • gunakan setiap output baris dengan findsebagai input untuk md5( | xargs md5)

Outputnya akan terlihat seperti ini jika ada perbedaan:

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
david_p
sumber