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 -s
hanya 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 -s
dengan panggilan ke sort
. The -k 2
bit 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 sort
panggilan. The find -s
varian 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 ls
dan semacamnya, yang secara diam-diam mengurutkan isi direktori untuk Anda. find
tanpa -s
atau sort
panggilan 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 md5sum
perintah ke md5
atau fungsi hash lainnya. Jika Anda memilih fungsi hash lain dan memerlukan bentuk kedua dari perintah untuk sistem Anda, Anda mungkin perlu menyesuaikan sort
perintah tersebut. Perangkap lain adalah bahwa beberapa program penjumlah data tidak menuliskan nama file sama sekali, contoh utama adalah sum
program Unix yang lama .
Metode ini agak tidak efisien, memanggil md5sum
N + 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 tar
untuk mengemas konten direktori untuk Anda, kemudian kirimkan ke md5sum
:
$ tar -cf - somedir | md5sum
Karena tar
juga 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 find
metode berbasis di atas, tar
akan 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 | cpio
opsi dalam jawaban Gilles .
find .
daripadafind somedir
. Dengan cara ini nama file sama ketika memberikan spesifikasi path yang berbeda untuk ditemukan; ini bisa rumit :-)