Saya mencoba untuk menghemat ruang saat melakukan backup "bodoh" dengan hanya membuang data ke file teks. Skrip cadangan saya dijalankan setiap hari dan terlihat seperti ini:
- Buat direktori dengan nama setelah tanggal cadangan.
- Buang beberapa data ke file teks
"$name"
. - Jika file tersebut valid, gzip itu:
gzip "$name"
. Jika tidakrm "$name"
,.
Sekarang saya ingin menambahkan langkah tambahan untuk menghapus file jika data yang sama juga tersedia di hari sebelumnya (dan buat symlink atau hardlink).
Awalnya saya berpikir untuk menggunakan md5sum "$name"
, tetapi ini tidak berhasil karena saya juga menyimpan nama file dan tanggal pembuatan.
Apakah gzip
ada opsi untuk membandingkan dua file yang di-gzip dan beri tahu saya apakah keduanya sama atau tidak? Jika gzip
tidak memiliki opsi seperti itu, apakah ada cara lain untuk mencapai tujuan saya?
gzip
file-comparison
Lekensteyn
sumber
sumber
diff <(zcat file1) <(zcat file2)
, tetapi saran mrethub tentangzdiff
terlihat jauh lebih baik.Jawaban:
Anda dapat menggunakan
zcmp
atauzdiff
seperti yang disarankan mreithub dalam komentarnya (atau perintah Kevin, yang serupa). Ini akan relatif tidak efisien, karena mereka benar-benar mendekompres kedua file dan kemudian meneruskannya kecmp
ataudiff
. Jika Anda hanya ingin menjawab "mereka sama", Anda maucmp
, itu akan jauh lebih cepat.Pendekatan Anda dengan
md5sum
sangat baik, tetapi Anda harus mengambil MD5 sebelum berjalangzip
. Kemudian simpan dalam file di samping file yang dihasilkan.gz
. Anda kemudian dapat membandingkan file dengan mudah, sebelum mengompresnya. Jika namanya sama,md5sum -c
akan melakukan ini untuk Anda.Dan cadangan selanjutnya:
Jadi itu belum berubah. OTOH, apakah sudah berubah:
Jika Anda lolos
--quiet
, itu hanya akan memberi Anda kode keluar. 0 untuk cocok, non-0 untuk berbeda.MD5 cukup cepat, tapi tidak begitu. MD4 (
openssl md4
adalah yang terbaik yang Anda dapatkan di baris perintah, saya percaya) sekitar dua kali lebih cepat (baik MD5 maupun aman, tetapi keduanya hampir sama tahan tabrakan ketika tidak ada yang mencoba menumbangkannya). SHA-1 (sha1sum
) lebih aman, tetapi lebih lambat; SHA-256 (sha256sum
) aman, tetapi bahkan lebih lambat lagi. CRC32 harus berkali-kali lebih cepat, tetapi lebih pendek dan karenanya akan memiliki lebih banyak tabrakan acak. Ini juga sepenuhnya tidak aman.sumber
zdiff
tampaknya sia-sia karena saya hanya ingin tahu apakah suatu file telah berubah, bukan apa .zcmp
terlihat menarik, saya akan coba itu.Jawaban @derobert luar biasa, walaupun saya ingin membagikan beberapa informasi lain yang saya temukan.
gzip -l -v
File yang dikompresi gzip sudah mengandung hash (meskipun tidak aman, lihat posting SO ini ):
Satu dapat menggabungkan CRC dan ukuran terkompresi untuk mendapatkan sidik jari cepat:
cmp
Untuk memeriksa apakah dua byte sama atau tidak, gunakan
cmp file1 file2
. Sekarang, file gzipped memiliki beberapa header dengan data dan footer (CRC plus ukuran asli) ditambahkan. The deskripsi gzip format yang menunjukkan bahwa header berisi waktu ketika file tersebut dikompres dan bahwa nama file adalah string nul-dihentikan yang ditambahkan setelah header 10-byte.Jadi, dengan asumsi bahwa nama file konstan dan perintah yang sama (
gzip "$name"
) digunakan, orang dapat memeriksa apakah dua file berbeda dengan menggunakancmp
dan melewatkan byte pertama termasuk waktu:Catatan : asumsi bahwa opsi kompresi yang sama adalah penting, jika tidak maka perintah akan selalu melaporkan file yang berbeda. Ini terjadi karena opsi kompresi disimpan di header dan dapat memengaruhi data yang dikompresi.
cmp
hanya melihat byte mentah dan tidak menafsirkannya sebagai gzip.Jika Anda memiliki nama file dengan panjang yang sama, maka Anda dapat mencoba menghitung byte yang akan dilewati setelah membaca nama file. Ketika nama file berukuran berbeda, Anda bisa menjalankan
cmp
setelah melewatkan byte, seperticmp <(cut -b9- file1) <(cut -b10- file2)
.zcmp
Ini jelas merupakan cara terbaik, pertama-tama memampatkan data dan mulai membandingkan byte dengan
cmp
(sungguh, inilah yang dilakukan di dalamzcmp
(zdiff
) shellscript).Satu catatan, jangan takut dengan catatan berikut di halaman manual:
Ketika Anda memiliki Bash yang cukup baru, kompresi tidak akan menggunakan file sementara, hanya sebuah pipa. Atau, seperti
zdiff
kata sumber itu:sumber
gzip -v -l
akan melaporkan waktu file daripada MTIME jika empat byte MTIME di header adalah nol. Perhatikan juga jika MTIME ada di sana, biasanya sedikit sebelum waktu file karena saat kompresi dimulai.Untuk membandingkan dua file gzip, cukup isi, satu perintah, tidak
diff
, hanya membandingkanmd5sum
Anda juga dapat "memfilter" untuk perbedaan yang relevan,
Jika scripting, saya akan merekomendasikan fungsi filter (tidak diuji, hanya sebuah contoh),
sumber
cmp
.zcat
dangrep
bisa digabung menjadizgrep
.zcat
itu adilgunzip -c
. Gunakan alat yang tepat untuk pekerjaan yang tepat, KISS lebih baik daripada mengasapi. Dalam hal ini saya akan menghabiskan waktu saya untuk menulis sesuatu yang menghasilkan tautan keras sesuai kebutuhan, itu lebih menyenangkan.