Saran ire_and_curses untuk menggunakan tar c <dir>
memiliki beberapa masalah:
- tar memproses entri direktori dalam urutan yang disimpan 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 tahu tidak ada cara untuk memperbaikinya (tar tidak dapat "mengurutkan" file inputnya dalam urutan tertentu).
- Saya biasanya peduli tentang apakah angka-angka groupid dan ownerid adalah sama, belum tentu apakah representasi string dari grup / pemilik adalah sama. Ini sesuai dengan apa yang contohnya
rsync -a --delete
lakukan: ini menyinkronkan hampir semuanya (dikurangi xattrs dan acls), tetapi akan menyinkronkan pemilik dan grup berdasarkan ID mereka, bukan pada representasi string. Jadi, jika Anda menyinkronkan ke sistem yang berbeda yang tidak harus memiliki pengguna / grup yang sama, Anda harus menambahkan --numeric-owner
bendera ke tar
- tar akan menyertakan nama file direktori yang Anda periksa sendiri, hanya sesuatu yang harus diperhatikan.
Selama tidak ada perbaikan untuk masalah pertama (atau kecuali Anda yakin itu tidak mempengaruhi Anda), saya tidak akan menggunakan pendekatan ini.
The find
solusi berbasis diusulkan di atas juga tidak baik karena mereka hanya menyertakan file, bukan direktori, yang menjadi masalah jika Anda checksumming yang harus diingat direktori kosong.
Akhirnya, 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:
- Hal
LC_ALL=C
ini untuk memastikan urutan sortir yang andal di seluruh sistem
- Ini tidak membedakan antara direktori "bernama \ nwithanewline" dan dua direktori "bernama" dan "withanewline", tetapi kemungkinan terjadinya itu tampaknya sangat tidak mungkin. Seseorang biasanya memperbaiki ini dengan sebuah
-print0
flag untuk find
tetapi karena ada hal-hal lain yang terjadi di sini, saya hanya dapat melihat solusi yang akan membuat perintah lebih rumit maka itu layak.
PS: salah satu sistem saya menggunakan busybox terbatas find
yang tidak mendukung -exec
atau -print0
menandai, dan juga menambahkan '/' untuk menunjukkan direktori, sementara findutils menemukan 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.