sha1sum ./path/to/directory/* | sha1sum
di atas telah diposting sebagai cara untuk menghitung sha1sum dari direktori yang berisi file. Perintah ini gagal jika direktori menyertakan lebih banyak direktori. Apakah ada cara untuk secara rekursif menghitung sha1sum dari direktori direktori secara universal (tanpa penyesuaian kustom algoritma ke direktori tertentu yang bersangkutan)?
find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum
@allquixoticSaya biasanya menyukai pola "find | xargs", seperti:
Anda harus menggunakan "-print0" dan "-0", jika ada spasi dalam nama file.
Namun, ini sangat mirip dengan pola "find -exec cmd {}".
Lihat diskusi yang membandingkan kedua pola di sini: https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs
sumber
find . -type f -print0 | xargs -0 sha1sum | awk '{print $1}' | sha1sum
.UPDATE: Sudah beberapa tahun sejak saya memposting balasan ini dan sementara itu saya telah menulis ulang dan memperbaiki skrip yang telah saya presentasikan di sini beberapa kali. Saya telah memutuskan untuk mengirim ulang skrip baru sebagai jawaban baru. Saya akan sangat merekomendasikan ini.
PENGANTAR
Saya telah mengamati bahwa urutan di mana perintah find mengeluarkan elemen-elemen yang ditemukan dalam direktori bervariasi dalam direktori yang identik pada partisi yang berbeda. Jika Anda membandingkan hash dari direktori yang sama, Anda tidak perlu khawatir tentang hal itu tetapi jika Anda mendapatkan hash untuk memastikan bahwa tidak ada file yang terlewat atau rusak selama salinan, Anda harus menyertakan baris tambahan untuk menyortir konten direktori dan elemen-elemennya. Misalnya, jawaban Matthew Bohnsack cukup elegan:
Tetapi jika Anda menggunakannya untuk membandingkan direktori yang disalin dengan aslinya, Anda akan mengirim output ke file txt yang akan Anda bandingkan dengan daftar yang dihasilkan dari direktori lain menggunakan Kompare atau WinMerge atau dengan hanya mendapatkan hash dari setiap lis . Masalahnya adalah, karena urutan di mana alat menemukan akan menampilkan konten dapat bervariasi dari satu direktori ke yang lain, Kompare akan memberi sinyal banyak perbedaan karena hash tidak dihitung dalam urutan yang sama. Bukan masalah besar untuk direktori kecil tetapi cukup menjengkelkan jika Anda berurusan dengan 30000 file. Oleh karena itu, Anda telah melakukan langkah-langkah tambahan untuk menyortir output agar lebih mudah membandingkan daftar hash antara dua direktori.
Ini akan mengurutkan output sehingga file dengan hash yang sama akan berada di baris yang sama ketika menjalankan program differencing (asalkan tidak ada file yang hilang direktori baru).
DAN KE ATAS SCRIPT ...
Berikut skrip yang saya tulis. Ia melakukan hal yang sama dengan jawaban find / xarg tetapi akan mengurutkan file sebelum mendapatkan sha1sum (menyimpannya di direktori yang sama). Baris pertama skrip menemukan semua file dalam direktori secara rekursif. Yang berikutnya mengurutkan hasil secara alfabet. Dua berikut, mengambil konten yang diurutkan dan menambahkan sha1sum dan tanda kutip ke file dalam daftar yang diurutkan, membuat skrip shell besar yang menghitung hash setiap file, satu per satu dan menampilkannya ke content_sha1sum.txt.
Semoga ini membantu.
sumber
sort -z
(--zero-terminated
) lebih mudah daripada mengacaukan banyak file.PENGANTAR
Beberapa tahun yang lalu, saya menulis dan menyajikan (dalam utas ini) sebuah skrip yang dapat memeriksa tanda tangan hash dari semua file individu dalam struktur direktori saat ini dan menampilkannya sebagai daftar dalam file teks.
Sejak itu, saya telah memperbaiki formula ini beberapa kali. Saya memutuskan untuk mengirim ulang skrip saya yang baru dan lebih baik di sini sebagai jawaban terpisah. Ini ditulis untuk sha256 tetapi siapa pun yang masih ingin menggunakan sha1 dapat melakukan pencarian sederhana dan ganti di gedit untuk menukar sha256 dengan sha1. Secara pribadi, saya belum pernah menggunakan sha1 selama beberapa tahun dan saya tidak akan merekomendasikannya karena sudah kuno dan google telah menunjukkan bagaimana hal itu dapat dikompromikan .
Inilah yang dilakukan skrip baru saya:
Anda cukup menggunakan skrip dengan masuk ke direktori yang ingin Anda hash dan masukkan:
Atau, Anda dapat memanggil skrip ini dari direktori lain dengan melakukan:
Script akan mendeteksi jika Anda memiliki hak istimewa menulis dalam direktori saat ini. Jika Anda melakukannya, hasilnya akan disimpan di direktori saat ini. Jika Anda tidak memiliki hak istimewa menulis atau jika direktori Anda saat ini berada dalam sistem read-only (seperti cdrom), hasilnya akan disimpan ke direktori home pengguna saat ini.
Script akan mendeteksi jika beberapa sub direktori tidak dapat diakses pada hak pengguna saat ini. Jika semua dapat dibaca maka tidak ada peningkatan hak istimewa yang terjadi, jika tidak, maka hak pengguna akan ditingkatkan ke root.
Find digunakan untuk menemukan semua file dalam struktur dir saat ini (termasuk semua sub-direktori). Sortir digunakan untuk memastikan hasil yang dikeluarkan sesuai abjad. Daftar yang dihasilkan mengalami sha256sum dan dikeluarkan ke file teks.
Sejak menulis skrip lama saya telah mengadopsi filosofi desain bahwa file temp adalah jahat dan harus dihindari bila memungkinkan karena mereka membiarkan pengguna terbuka untuk mengintip dan merusak oleh pihak ketiga yang berbahaya. Jadi semua data dalam skrip baru ini dimanipulasi sebagai variabel hingga menit terakhir di mana hasilnya ditampilkan sebagai file teks.
File yang dihasilkan itu sendiri adalah hash dan path / hash dihasilkan di terminal. Saya suka mengambil gambar hash ini dengan kamera offline sekolah lama untuk dapat memastikan bahwa file hasil belum diubah ketika saya merujuknya di kemudian hari.
File hasil lama diabaikan dalam penghitungan. Itu membuat membandingkan hasil lebih mudah.
Ini adalah contoh keluaran terminal saat menjalankan skrip saya:
Berikut adalah cuplikan dari output yang dapat ditemukan di 000_sha256sum_recurs_linux-header-4.13.0-16-generic_d_22-04-2018_t_02.17.txt:
(Ini berlangsung selama 7000+ baris lain seperti ini tetapi Anda mendapatkan ide)
INSTALASI
Buka terminal dan masukkan perintah berikut:
Di nano, gunakan Shif + Ctrl + v untuk menempel. Ctrl-O dan Enter untuk menyimpan. Ctr-X keluar. Rekatkan skrip saya di sana:
(tempel setelah #! / bin / bash)
Saat Anda keluar dari nano, pastikan untuk keluar dari status yang ditinggikan dengan memasukkan:
PIKIRAN FINAL
Ini hanya akan berfungsi jika Anda telah menginstal bash. Saya telah menggunakan beberapa sintaks untuk manipulasi substring yang tidak berfungsi dengan sh, dash, ksh, atau zsh. Anda masih dapat menggunakan shell lain sebagai driver harian Anda tetapi bash perlu diinstal.
Daftar keluaran dapat dibandingkan dengan berbagai alat seperti: (di terminal) diff, sdiff (dan grafis) difus, kdiff, winmerge.
File saya mengurutkan output berdasarkan path, untuk membuatnya lebih mudah dibaca oleh manusia. Saya perhatikan perintah sortir bekerja secara berbeda di distro yang berbeda. Misalnya, dalam satu distro, huruf MODAL lebih diprioritaskan daripada yang bukan huruf kapital dan yang lain tidak. Ini mempengaruhi urutan baris file output dan dapat membuat file sulit untuk dibandingkan. Ini seharusnya tidak menimbulkan masalah jika Anda selalu menggunakan skrip di distro yang sama tetapi mungkin jika daftar hash dihasilkan di dua lingkungan yang berbeda. Ini mudah diperbaiki dengan mengurutkan file hash waktu tambahan sehingga baris menjadi dipesan oleh hash daripada path:
sumber
#!/usr/bin/env bash
- ia akan menemukan Bash di direktori lain juga, karena yang terakhir mungkin dipasang di / usr / bin daripada / bin , misalnya, sementara itu env cenderung berada di / usr / bin setiap saat. sejauh yang saya perhatikan. Yang juga perlu diperhatikan adalah bahwa, karena Anda memerlukan Bash, Anda dapat menggunakan[[ blah-blah ]]
ekspresi bersyarat braket ganda alih-alih[ blah-blah ]
varian braket tunggal yang lebih umum .Ini sepertinya bekerja untuk saya:
EDIT: ini hanya akan sha1sum semua file yang terkandung dalam pohon direktori. Jika nama direktori diubah, ini tidak akan menangkapnya. Mungkin sesuatu seperti:
Akan melakukannya. Tentang jawaban yang sama dengan yang lainnya
sumber
Trik lain mungkin menggunakan tar untuk hash isi file & metadata:
sumber
Solusi cepat, kuat, dan portabel
Tidak seperti beberapa solusi lain yang melibatkan
tar
, solusi di bawah ini berfungsi pada mesin apa pun yang memiliki utilitas Unix standar, dan lebih cepat daripada semua solusi lain dengan memaralelkan checksumming:Karena menggunakan semacam di akhir, tidak ada kemajuan waktu nyata, jadi biarkan perintah berjalan.
Inilah yang dilakukan argumen:
find . -type f
menemukan semua file di direktori saat ini dan subdirektorixargs -d'\n'
membagi output find menjadi baris (jika Anda berharap memiliki file dengan baris baru di dalamnya, maka lakukan yang biasafind -print0 | xargs -0
)-P0 n1
berjalanmd5sum
dalam proses paralel, menggunakan jumlah maksimum proses yang didukung oleh mesin (multi-core!)sort -k 2
mengurutkan berdasarkan bidang kedua darimd5sum
output, yang merupakan path lengkap ke setiap file (yang pertama adalah MD5)md5sum
menghitung checksum dari daftar checksum file, sehingga Anda mendapatkan checksum dari seluruh direktori pada satu baris, yang dapat Anda bandingkan dengan mudah secara visual di seluruh jendela terminalSebelum Anda mengatakan bahwa "MD5 telah dikompromikan", ingatlah apa model ancaman Anda. Apakah Anda mencoba memastikan bahwa file yang Anda salin dari host atau disk lain tiba utuh? Maka MD5 lebih dari cukup, karena kemungkinan file rusak dalam perjalanan tetapi memiliki MD5 yang sama adalah nol. Tetapi jika Anda takut penyerang punya waktu untuk mengganti file dengan yang berbeda dengan collum checksum, maka gunakan
sha256sum
. Kelemahannya adalah fungsi SHA lebih lambat dari MD5 .Kemajuan verbose waktu-nyata
Akhirnya, jika Anda ingin melihat kemajuan waktu nyata, ubah pipa untuk menggunakan file sementara untuk checksum:
(Perhatikan bahwa memindahkan
sort
hak setelahfind
tidak akan berfungsi, karenaxargs -P0
diparalelkanmd5sum
, dan hasilnya dapat keluar dari urutan.)Versi perintah ini juga memungkinkan Anda untuk membedakan kedua
/tmp/sums
file (pastikan untuk mengganti nama yang kedua jika menggunakan mesin yang sama) dan melihat file mana yang berbeda.sumber
Alih-alih memiliki SATU file besar yang berisi semua informasi hash saya mencari cara untuk membuat file di setiap folder pohon. Saya mengambil beberapa inspirasi dari komentar di sini. Milik saya sedikit lebih kompleks daripada yang diposting di sini. Saya menggunakan rotasi file tetapi ini adalah yang paling kompleks untuk pemain baru. Versi ini akan menimpanya dengan jumlah cek lama dengan yang baru. Mungkin baik untuk menyimpan 2-3 versi tergantung pada seberapa sering Anda menjalankannya dan kebutuhan Anda untuk 'mendalam'.
Perhatikan bahwa mkshaindir, untuk tujuan saya, adalah komponen terpisah karena mungkin ada kebutuhan bagi saya untuk membuat hash file dalam folder baru, atau salah satu yang baru saja diubah. Ini semua dapat digabungkan menjadi satu skrip jika diperlukan.
Sisanya dibiarkan sebagai latihan untuk pembaca.
sumber
berdasarkan jawaban sebelumnya :
find ./path/to/directory -print0 | LC_ALL=C sort --zero-terminated | tar --create --no-recursion --null --files-from /dev/stdin --file /dev/stdout --verbose --numeric-owner | sha1sum
sumber
@allquixotic
Jawabannya tidak menghasilkan hash yang sama pada mesin yang berbeda yang tidak akan membantu kami memverifikasi dan memiliki hash yang konsisten.Baris
find . -type f \( -exec md5sum "$PWD"/{} \; \)
berikut mengembalikan output berikut:Karenanya jalan akan berbeda pada mesin yang berbeda.
awk '{print $1}'
akan membantu kami memperoleh kolom pertama, yang hanya memiliki hash file. Kemudian kita perlu mengurutkan hash tersebut, di mana urutannya mungkin berbeda pada mesin yang berbeda, yang juga dapat menyebabkan kita memiliki hash yang berbeda jika ada lebih dari dua file.Larutan:
Untuk Mac:
Untuk Linux:
sumber