Saya perlu menghitung checksum md5 ringkasan untuk semua file dari jenis tertentu ( *.py
misalnya) ditempatkan di bawah direktori dan semua sub-direktori.
Apa cara terbaik untuk melakukannya?
Sunting: Solusi yang diusulkan sangat bagus, tetapi ini bukan yang saya butuhkan. Saya mencari solusi untuk mendapatkan ringkasan ringkasan tunggal yang akan secara unik mengidentifikasi direktori secara keseluruhan - termasuk konten dari semua sub-direktori.
Jawaban:
Perintah find mencantumkan semua file yang berakhiran .py. MD5sum dihitung untuk setiap file .py. awk digunakan untuk mengambil md5sums (mengabaikan nama file, yang mungkin tidak unik). MD5sum diurutkan. MD5sum dari daftar yang diurutkan ini kemudian dikembalikan.
Saya sudah menguji ini dengan menyalin direktori tes:
Saya mengganti nama beberapa file di ~ / pybin2.
The
find...md5sum
perintah mengembalikan output yang sama untuk kedua direktori.sumber
awk ...
bagian jika Anda mempertimbangkan tata letak bagian dari tanda tangan.Buat file arsip tar dengan cepat dan pipa yang ke
md5sum
:Ini menghasilkan satu md5sum tunggal yang harus unik untuk pengaturan file dan sub-direktori Anda. Tidak ada file yang dibuat di disk.
sumber
ls -alR dir | md5sum
. Ini lebih baik tanpa kompresi hanya membaca. Ini unik karena kontennya berisi waktu mod dan ukuran file;)z
untuk gzip, atauj
untuk bzip2. Saya belum melakukan keduanya.tar
set file yang sama dua kali, atau pada dua komputer yang berbeda, akan menghasilkan hasil yang persis sama.Saran ire_and_curses untuk menggunakan
tar c <dir>
memiliki beberapa masalah: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 tarSelama 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:
Catatan tentang solusi ini:
LC_ALL=C
ini untuk memastikan urutan sortir yang andal di seluruh sistem-print0
flag untukfind
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:Untungnya, saya tidak memiliki file / direktori dengan baris baru di namanya, jadi ini bukan masalah pada sistem itu.
sumber
Jika Anda hanya peduli pada file dan tidak mengosongkan direktori, ini berfungsi dengan baik:
sumber
Demi kelengkapan, ada md5deep (1) ; itu tidak langsung berlaku karena * .py persyaratan filter tetapi harus baik-baik saja bersama dengan find (1).
sumber
Solusi yang paling berhasil bagi saya:
Alasan mengapa itu bekerja paling baik untuk saya:
Masalah dengan jawaban lain:
Meta-data Filesystem tidak diabaikan untuk:
tar c - "$path" | md5sum
Tidak menangani nama file yang mengandung spasi atau mendeteksi jika file telah diubah namanya:
sumber
Jika Anda ingin satu md5sum mencakup seluruh direktori, saya akan melakukan sesuatu seperti
sumber
cat **.py
| md5sumPeriksa semua file, termasuk konten dan nama file mereka
Sama seperti di atas, tetapi hanya termasuk file * .py
Anda juga dapat mengikuti symlink jika mau
Opsi lain yang bisa Anda pertimbangkan untuk digunakan dengan grep
sumber
GNU temukan
sumber
Secara teknis Anda hanya perlu menjalankan
ls -lR *.py | md5sum
. Kecuali jika Anda khawatir tentang seseorang yang memodifikasi file dan menyentuhnya kembali ke tanggal aslinya dan tidak pernah mengubah ukuran file, output darils
akan memberi tahu Anda jika file telah berubah. Unix-foo saya lemah sehingga Anda mungkin perlu beberapa parameter baris perintah lagi untuk mendapatkan waktu buat dan waktu modifikasi untuk mencetak.ls
juga akan memberi tahu Anda jika izin pada file telah berubah (dan saya yakin ada saklar untuk mematikannya jika Anda tidak peduli tentang itu).sumber
touch
file untuk mengubah tanggalnya (tetapi tidak isinya) maka saya berharap checksum tidak akan berubah.Menggunakan
md5deep
:md5deep -r FOLDER | awk '{print $1}' | sort | md5sum
sumber
Saya mempunyai masalah yang sama jadi saya datang dengan skrip ini yang hanya mencantumkan md5sums dari file dalam direktori dan jika ia menemukan subdirektori ia berjalan lagi dari sana, agar ini terjadi skrip harus dapat dijalankan melalui arus direktori atau dari subdirektori jika argumen tersebut diberikan dalam $ 1
sumber
Jika Anda ingin benar-benar independen dari atribut filesystem dan dari perbedaan level bit dari beberapa versi tar, Anda bisa menggunakan cpio:
sumber
Ada dua solusi lagi:
Membuat:
Memeriksa:
sumber
md5sum
bekerja dengan baik untuk saya, tetapi saya memiliki masalah dengansort
dan mengurutkan nama file. Jadi alih-alih saya mengurutkan berdasarkanmd5sum
hasil. Saya juga perlu mengecualikan beberapa file untuk membuat hasil yang sebanding.find . -type f -print0 \ | xargs -r0 md5sum \ | grep -v ".env" \ | grep -v "vendor/autoload.php" \ | grep -v "vendor/composer/" \ | sort -d \ | md5sum
sumber