Hasilkan checksum md5 untuk semua file dalam direktori

75

Saya ingin membuat daftar checksum MD5 untuk semua file dalam direktori.

Saya ingin cat filename | md5sum > ouptput.txt. Saya ingin melakukan ini dalam 1 langkah untuk semua file di direktori saya.

Bantuan apa pun akan bagus.

Walter Wayne Leutwyler
sumber
Bagaimana saya bisa menemukan md5sum (checksum) dari file cadangan tertentu? -Apa yang seharusnya menjadi skrip saya -apa perintah untuknya

Jawaban:

110

Anda dapat melewati md5sumbeberapa nama file atau ekspansi bash:

$ md5sum * > checklist.chk  # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk   # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK

Jika Anda ingin menjadi mewah, Anda dapat menggunakan hal-hal seperti findmenelusuri dan memfilter file, serta bekerja secara rekursif:

find -type f -exec md5sum "{}" + > checklist.chk
Oli
sumber
1
♦ bagaimana cara menggunakan di atas untuk mendapatkan md5sumfile-file di dalam sub direktori, md5sum *emisi di atas masuk ke tingkat subdirektori dengan mengatakan ... adalah direktori
Kasun Siyambalapitiya
Maaf karena bertanya dengan menjalankan find -type f -exec md5sum '{}' +dan `find -type f -exec md5sum '{}'` Saya bisa mendapatkannya. Terima kasih :)
Kasun Siyambalapitiya
Saya lebih suka tampilan output ini lebih:openssl md5 * > checklist.txt
ashley
1
Jika Anda menggunakan shell yang senang mengevaluasi **secara rekursif (seperti zsh), itu bahkan lebih sederhana:md5sum **/* 2>/dev/null
Joost
12

Program pembuatan / verifikasi checksum yang bagus adalah rhash. Itu bahkan menciptakan file yang kompatibel dengan SFV, dan memeriksanya juga.

Ini mendukung md4, md5, sha1, sha512, crc32 dan banyak lainnya.

Selain itu dapat melakukan penciptaan rekursif (opsi -r) seperti md5deep atau sha1deep.

Terakhir, Anda dapat memformat output file checksum; sebagai contoh:

rhash --md5 -p '%h,%p\n' -r /home/

mengeluarkan file CSV termasuk path lengkap file secara rekursif dimulai dengan /homedirektori.

Saya menemukan sangat berguna bahkan opsi -e mengubah nama file dengan memasukkan jumlah crc32 ke nama.

Anda dapat mengubah "md5sum" dengan "rhash" pada contoh PhoenixNL72.

Marcolino
sumber
1
Apa yang sebenarnya dilakukan oleh '/ rumah /' di sini? Alat ini terlihat cukup bagus.
Andy Ibanez
Saya pikir ini adalah kesalahan, itu tentu saja kesalahan bagi saya. -P adalah format untuk output. Saya akan memperbaikinya.
pbhj
7

Berikut adalah dua contoh yang lebih luas:

  1. Buat file md5 di setiap direktori yang belum memilikinya, dengan jalur absolut:

    find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] &&  md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done 
    
  2. Buat file md5 di setiap folder yang belum memiliki satu: tidak ada jalur, hanya nama file:

    find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] &&  md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done 
    

Apa yang berbeda antara 1 dan 2 adalah cara file disajikan dalam file md5 yang dihasilkan.

Perintahnya lakukan hal berikut:

  1. Buat daftar nama direktori untuk folder saat ini. (Pohon)
  2. Sortir daftar folder.
  3. Periksa di setiap direktori jika file @ md5sum.md5 ada. Output Dilewati jika ada, output Memproses jika tidak ada.
  4. Jika file @ md5Sum.md5 tidak ada, md5Sum akan menghasilkan satu dengan checksum dari semua file dalam folder. 5) Atur file @ md5Sum.md5 yang dihasilkan hanya untuk dibaca.

Keluaran seluruh skrip ini dapat diarahkan ke file (.....; selesai> test.log) atau disalurkan ke program lain (seperti grep). Output hanya akan memberi tahu Anda direktori mana yang dilewati dan yang telah diproses.

Setelah menjalankan yang sukses, Anda akan berakhir dengan file @ md5Sum.md5 di setiap subdirektori dari direktori Anda saat ini

Saya menamai file @ md5Sum.md5 sehingga akan terdaftar di bagian atas direktori di share samba.

Memverifikasi semua file @ md5Sum.md5 dapat dilakukan dengan perintah berikut:

find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt

Setelah itu Anda dapat grep checklog.txt menggunakan grep -v OK untuk mendapatkan daftar semua file yang berbeda.

Untuk membuat ulang @ md5Sum.md5 di direktori tertentu, ketika Anda mengubah atau menambahkan file misalnya, hapus file @ md5Sum.md5 atau ganti nama dan jalankan perintah generate lagi.

PhoenixNL72
sumber
Perintah # 1 menggunakan path lengkap: md5sum "$ {dir}" / * tidak mengambil file tersembunyi yang dimulai dengan titik. Ada obatnya?
user14654
Terlambat ke pesta, tetapi karena md5sum ingin nama file (sepertinya uhappy jika Anda memberikannya direktori), mungkin lebih mudah untuk meminta bantuan: $ md5sum $ (temukan "$ dir" -maxdepth 0 -type f) The "- ketik f "menarik file biasa dan .hidden (juga, temukan memiliki banyak opsi, tetapi dapat sangat membantu). Hapus bagian "-maxdepth 0" jika Anda ingin semuanya dilakukan secara rekursif. Catatan: ini rapuh jika nama file memiliki ruang yang disematkan, maka Anda dapat membaca di xargs dan -0 ( en.wikipedia.org/wiki/Xargs )
jgreve
0

Saya mengalami masalah ini, dan sementara solusi di atas elegan, saya ingin hack cepat dan kotor untuk situasi ini: 1 direktori, dengan subdirektori satu tingkat jauh di dalamnya.

Jadi, masukkan direktori di shell dan jalankan:

md5sum * */* 2>/dev/null > md5sum.md5

Ini mendapatkan semua file di direktori tingkat atas, menghilangkan peringatan kesalahan tentang sub direktori menjadi direktori, dan kemudian menjalankan md5sums pada konten subdirektori. Keuntungan: mudah diingat, melakukan apa yang seharusnya dilakukan. Saya selalu bingung dengan menemukan sintaks dan tidak pernah bisa mengingatnya dari atas kepala saya, jadi tidak perlu untuk mengulang dll, berurusan dengan spasi dalam nama direktori, liner yang satu ini bekerja dengan baik. Bukan solusi tangguh yang kuat, tidak baik untuk subdirektori level> 1, tetapi solusi cepat dan mudah untuk masalah ini.

Lizardx
sumber