Cara yang tepat tergantung pada mengapa Anda bertanya:
Opsi 1: Bandingkan Hanya Data
Jika Anda hanya memerlukan hash dari isi file tree, ini akan melakukan trik:
$ find -s somedir -type f -exec md5sum {} \; | md5sum
Ini pertama meringkas semua konten file secara individual, dalam urutan yang dapat diprediksi, kemudian melewati daftar nama file dan hash MD5 untuk di-hash sendiri, memberikan nilai tunggal yang hanya berubah ketika konten salah satu file di pohon berubah.
Sayangnya, find -shanya berfungsi dengan BSD find (1), digunakan di macOS, FreeBSD, NetBSD dan OpenBSD. Untuk mendapatkan sesuatu yang sebanding pada sistem dengan GNU atau SUS find (1), Anda perlu sesuatu yang sedikit lebih jelek:
$ find somedir -type f -exec md5sum {} \; | sort -k 2 | md5sum
Kami telah mengganti find -sdengan panggilan ke sort. The -k 2bit mengatakan itu untuk melewatkan hash MD5, sehingga hanya mengurutkan nama file, yang di lapangan 2 sampai akhir-of-line, dengan sort's hisab.
Ada kelemahan dengan versi perintah ini, yaitu kemungkinan besar menjadi bingung jika Anda memiliki nama file dengan baris baru di dalamnya, karena akan terlihat seperti beberapa baris sortpanggilan. The find -svarian tidak memiliki masalah itu, karena traversal pohon dan penyortiran terjadi dalam program yang sama, find.
Dalam kedua kasus tersebut, penyortiran diperlukan untuk menghindari kesalahan positif: sistem file Unix / Linux yang paling umum tidak mempertahankan daftar direktori dalam urutan yang stabil dan dapat diprediksi. Anda mungkin tidak menyadari ini dari penggunaan lsdan semacamnya, yang secara diam-diam mengurutkan isi direktori untuk Anda. findtanpa -satau sortpanggilan akan mencetak file dalam urutan apa pun yang mengembalikan sistem file yang mendasarinya, yang akan menyebabkan perintah ini untuk memberikan nilai hash yang diubah jika urutan file yang diberikan sebagai perubahan input.
Anda mungkin perlu mengubah md5sumperintah ke md5atau fungsi hash lainnya. Jika Anda memilih fungsi hash lain dan memerlukan bentuk kedua dari perintah untuk sistem Anda, Anda mungkin perlu menyesuaikan sortperintah tersebut. Perangkap lain adalah bahwa beberapa program penjumlah data tidak menuliskan nama file sama sekali, contoh utama adalah sumprogram Unix yang lama .
Metode ini agak tidak efisien, memanggil md5sumN + 1 kali, di mana N adalah jumlah file di pohon, tetapi itu adalah biaya yang diperlukan untuk menghindari hashing metadata file dan direktori.
Opsi 2: Bandingkan Data dan Metadata
Jika Anda harus dapat mendeteksi bahwa segala sesuatu dalam pohon telah berubah, bukan hanya konten file, minta taruntuk mengemas konten direktori untuk Anda, kemudian kirimkan ke md5sum:
$ tar -cf - somedir | md5sum
Karena tarjuga melihat izin file, kepemilikan, dll., Ini juga akan mendeteksi perubahan pada hal-hal tersebut, bukan hanya perubahan pada konten file.
Metode ini jauh lebih cepat, karena hanya membuat satu melewati pohon dan menjalankan program hash hanya sekali.
Seperti findmetode berbasis di atas, tarakan memproses nama file dalam urutan yang mengembalikan sistem file yang mendasarinya. Mungkin dalam aplikasi Anda, Anda dapat yakin bahwa ini tidak akan terjadi. Saya bisa memikirkan setidaknya tiga pola penggunaan yang berbeda di mana itu mungkin terjadi. (Saya tidak akan mencantumkannya, karena kita masuk ke wilayah perilaku yang tidak ditentukan. Setiap sistem file dapat berbeda di sini, bahkan dari satu versi OS ke yang berikutnya.)
Jika Anda mendapati diri Anda mendapatkan hasil positif palsu, saya akan merekomendasikan memilih find | cpioopsi dalam jawaban Gilles .
find .daripadafind somedir. Dengan cara ini nama file sama ketika memberikan spesifikasi path yang berbeda untuk ditemukan; ini bisa rumit :-)