@ derobert'in cevabı harika, ancak bulduğum bazı bilgileri paylaşmak istiyorum.
gzip -l -v
gzip sıkıştırılmış dosyalar zaten bir karma içerir (ancak güvenli değil, bu SO yazısına bakın ):
$ echo something > foo
$ gzip foo
$ gzip -v -l foo.gz
method crc date time compressed uncompressed ratio uncompressed_name
defla 18b1f736 Feb 8 22:34 34 10 -20.0% foo
Hızlı bir parmak izi elde etmek için CRC ve sıkıştırılmamış boyut birleştirilebilir:
gzip -v -l foo.gz | awk '{print $2, $7}'
cmp
İki baytın eşit olup olmadığını kontrol etmek için kullanın cmp file1 file2
. Şimdi, gzip ile sıkıştırılmış bir dosyaya veri ve altbilgi (CRC artı orijinal boyut) eklenmiş bir başlık var. Gzip biçimi tanımı başlık dosyası sıkıştırılmıştır ve dosya ismi 10-bayt başlığından sonra eklenen bir nul-sonlu dizisi olduğu zaman içerdiğini gösterir.
Bu nedenle, dosya adının sabit olduğunu ve aynı command ( gzip "$name"
) kullanıldığını varsayarsak cmp
, zaman dahil ilk baytları kullanarak ve atlayarak iki dosyanın farklı olup olmadığını kontrol edebiliriz :
cmp -i 8 file1 file2
Not : aynı sıkıştırma seçeneklerinin önemli olduğu varsayımı, aksi takdirde komut her zaman dosyayı farklı olarak rapor edecektir. Bunun nedeni, sıkıştırma seçeneklerinin başlıkta depolanması ve sıkıştırılmış verileri etkileyebilmesidir. cmp
sadece ham baytlara bakar ve bunu gzip olarak yorumlamaz.
Aynı uzunlukta dosya adlarınız varsa, dosya adını okuduktan sonra atlanacak baytları hesaplamayı deneyebilirsiniz. Dosya adları farklı boyutlarda olduğunda, cmp
baytları atladıktan sonra çalışabilirsiniz cmp <(cut -b9- file1) <(cut -b10- file2)
.
zcmp
Bu kesinlikle gitmek için en iyi yoldur, önce verileri sıkıştırır ve baytları karşılaştırmaya başlar cmp
(gerçekten, zcmp
( zdiff
) shellscriptinde yapılan budur).
Bir not, kılavuz sayfasında aşağıdaki nottan korkmayın:
Karşılaştırma işleminden önce her iki dosyanın da sıkıştırılması gerektiğinde, ikincisi / tmp ile sıkıştırılmamış olur. Diğer tüm durumlarda, zdiff ve zcmp yalnızca bir boru kullanır.
Yeterince yeni bir Bash'iniz olduğunda, sıkıştırma geçici bir dosya kullanmaz, sadece bir pipo kullanır. Veya, zdiff
kaynağın dediği gibi:
# Reject Solaris 8's buggy /bin/bash 2.03.