GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa menghitung checksum md5 dari sebuah direktori?

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 untuk find , 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

Linux
  1. Cara mengecualikan direktori di find . memerintah

  2. Bagaimana saya bisa menjalankan dos2unix di seluruh direktori?

  3. Bagaimana cara menghitung jumlah file di setiap direktori?

  1. Bagaimana saya bisa menemukan file/direktori yang bisa berada di mana saja di baris perintah linux?

  2. Bagaimana saya bisa melakukan chmod rekursif hanya pada direktori?

  3. Bagaimana saya bisa menemukan semua file yang di-hardlink pada sistem file?

  1. Bagaimana saya bisa menemukan file terlama di pohon direktori

  2. Bagaimana cara menghapus file atau direktori bernama \?

  3. bagaimana saya bisa menghapus direktori kosong secara rekursif di direktori home saya?