Bir sıkıştırılmış dosyanın boş olup olmadığını nasıl kontrol edebilirim?


10

Bir gzip dosyasının boş olup olmadığını kontrol etmenin hızlı bir yolu var mı yoksa önce onu açmak zorunda mıyım?

misal:

$ touch foo
$ if [ -s foo ]; then echo not empty; fi
$ gzip foo
$ if [ -s foo.gz ]; then echo not empty; fi
not empty
$ wc -l foo.gz
      1 foo.gz

Yanıtlar:


8

gzip -l foo.gz | awk 'NR==2 {print $2}' sıkıştırılmamış verilerin boyutunu yazdırır.

if LC_ALL=C gzip -l foo.gz | awk 'NR==2 {exit($2!=0)}'; then
  echo foo is empty
else
  echo foo is not empty
fi

Alternatif olarak, verileri açmaya başlayabilirsiniz.

if [ -n "$(gunzip <foo.gz | head -c 1 | tr '\0\n' __)" ]; then
    echo "foo is not empty"
else
    echo "foo is empty"
fi

(Sisteminizin head -cilk baytı ayıklaması gerekmiyorsa, head -n 1bunun yerine ilk satırı ayıklamak için kullanın.)


Ben varsayalım LC_ALL=Calan sıfıra şekilde karşılaştırılabilmesi için gzip sayılarda bin ayırıcılar koymak olmadığından emin olmak için vardır?
camh

1
@camh: Bir komuttan biçimlendirilmiş çıktı ayrıştırılırken daha genel paranoyadır. Sayı biçimi olabilir veya bazı dillerde iki başlık satırı veya daha önce hiç düşünmediğim başka şeyler olabilir. Gzip durumunda, bence kötü bir şey olmaz, ama LC_ALL=Cincinemez.
Gilles 'SO- kötü olmayı kes

1
Dosyada veri varsa, ancak yeni satır yoksa ikinci alternatif başarısız olur; ayrıca readbir alt kabukta çağrıldığı için satırı yazdırmaz (ve $lineana öğeye yayılmaz).
Chris Down

1
@ChrisDown İyi tespit edildi. Düzeltmeniz yeterli değil (ayrıca yazma şekliniz sadece bash). Dosya bir boş bayt ile başlarsa, kabuk (zsh dışında), olmaması gerektiğinde boş bir dize görür. Bir boru trbunu düzeltir.
Gilles 'SO- kötü olmayı bırak'

4

'Boş' ile sıkıştırılmamış dosyanın 0 bayt olduğunu kastediyorsanız, sıkıştırılmamış dosyanın gzip --list foo.gzboyutunu belirlemek için kullanabilirsiniz , dosyayı otomatikleştirmek için bazı ayrıştırmalar gerekir. Şuna benziyor:

$ gzip --list foo.gz
         compressed        uncompressed  ratio uncompressed_name
                 24                   0   0.0% foo

Bu aslında cevap 1!
Henno Brandsma

1
... bundan sonra gönderilmişti.
jsbillings

2
test -z $(gzip -cd foo.gz | head -c1) && echo "empty"

Veya if:

if [ -z $(gzip -cd foo.gz | head -c1) ]; then
  echo "empty"
fi

zcatbazen daha kısa "form" olarak kullanmak istiyorsanız gunzip -cveya ile bağlantılıdır gzip -cd.


0

Lütfen gzip dosya formatının yalnızca orijinal dosya boyutunu saklamak için 32 bit'e izin verdiğini unutmayın, bu nedenle sayı 2ulo2 boyutundadır. Bu nedenle "gzip -l" tarafından verilen boyut, boşluk için kesin bir test değildir.


2
Lütfen bir çözüme nasıl yaklaşacağınıza ilişkin bir örnek ekleyerek bunu daha eksiksiz bir cevap haline getirin.
George M
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.