Buat file arsip tar dengan cepat dan kirimkan ke md5sum
:
tar c dir | md5sum
Ini menghasilkan satu nilai hash MD5 yang harus unik untuk pengaturan file dan sub-direktori Anda. Tidak ada file yang dibuat di disk.
Jika Anda hanya peduli dengan file dan bukan direktori kosong, ini berfungsi dengan baik:
find /path -type f | sort -u | xargs cat | md5sum
saran ire_and_curses untuk menggunakan tar c <dir>
memiliki beberapa masalah:
- tar memproses entri direktori sesuai urutan penyimpanannya di sistem file, dan tidak ada cara untuk mengubah urutan ini. Ini secara efektif dapat menghasilkan hasil yang sangat berbeda jika Anda memiliki direktori "sama" di tempat yang berbeda, dan saya tidak tahu cara untuk memperbaikinya (tar tidak dapat "mengurutkan" file masukannya dalam urutan tertentu).
- Saya biasanya peduli apakah nomor groupid dan ownerid sama, belum tentu apakah representasi string dari grup/pemilik sama. Ini sejalan dengan apa misalnya
rsync -a --delete
tidak:itu menyinkronkan hampir semuanya (minus xattrs dan acls), tetapi itu akan menyinkronkan pemilik dan grup berdasarkan ID mereka, bukan pada representasi string. Jadi jika Anda menyinkronkan ke sistem lain yang belum tentu memiliki pengguna/grup yang sama, Anda harus menambahkan--numeric-owner
tandai ke tar - tar akan menyertakan nama file dari direktori yang Anda periksa sendiri, hanya sesuatu yang harus diperhatikan.
Selama tidak ada perbaikan untuk masalah pertama (atau kecuali Anda yakin itu tidak memengaruhi Anda), saya tidak akan menggunakan pendekatan ini.
find
yang diusulkan -solusi berbasis juga tidak baik karena mereka hanya menyertakan file, bukan direktori, yang menjadi masalah jika Anda checksuming harus mengingat direktori kosong.
Terakhir, sebagian besar solusi yang disarankan tidak mengurutkan secara konsisten, karena susunannya mungkin berbeda di seluruh sistem.
Ini adalah solusi yang saya buat:
dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum
Catatan tentang solusi ini:
LC_ALL=C
adalah untuk memastikan urutan penyortiran yang andal di seluruh sistem- Ini tidak membedakan antara direktori "bernama\ndengan baris baru" dan dua direktori "bernama" dan "dengan baris baru", tetapi kemungkinan hal itu terjadi tampaknya sangat kecil kemungkinannya. Seseorang biasanya memperbaikinya dengan
-print0
bendera untukfind
, tetapi karena ada hal lain yang terjadi di sini, saya hanya dapat melihat solusi yang akan membuat perintah menjadi lebih rumit daripada nilainya.
PS:salah satu sistem saya menggunakan busybox find
yang terbatas yang tidak mendukung -exec
maupun -print0
flags, dan juga menambahkan '/' untuk menunjukkan direktori, sementara findutils find sepertinya tidak, jadi untuk mesin ini saya perlu menjalankan:
dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum
Untungnya, saya tidak memiliki file/direktori dengan baris baru di namanya, jadi ini bukan masalah pada sistem itu.
find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | awk '{print $1}' | sort | md5sum
temuan perintah mencantumkan semua file yang diakhiri dengan .py. Nilai hash MD5 dihitung untuk setiap file .py. AWK digunakan untuk mengambil nilai hash MD5 (mengabaikan nama file, yang mungkin tidak unik). Nilai hash MD5 diurutkan. Nilai hash MD5 dari daftar terurut ini kemudian dikembalikan.
Saya telah mengujinya dengan menyalin direktori pengujian:
rsync -a ~/pybin/ ~/pybin2/
Saya mengganti nama beberapa file di ~/pybin2 .
find...md5sum
perintah mengembalikan keluaran yang sama untuk kedua direktori.
2bcf49a4d19ef9abd284311108d626f1 -
Untuk memperhitungkan tata letak file (jalur), agar checksum berubah jika file diganti namanya atau dipindahkan, perintahnya dapat disederhanakan:
find /path/to/dir/ -type f -name "*.py" -exec md5sum {} + | md5sum
Di macOS dengan md5
:
find /path/to/dir/ -type f -name "*.py" -exec md5 {} + | md5