यदि कोई gzipped फ़ाइल खाली है तो मैं कैसे जांच सकता हूं?


10

क्या यह जांचने का कोई त्वरित तरीका है कि क्या कोई gzipped फ़ाइल खाली है, या क्या मुझे इसे पहले खोलना है?

उदाहरण:

$ 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

जवाबों:


8

gzip -l foo.gz | awk 'NR==2 {print $2}' असम्पीडित डेटा के आकार को प्रिंट करता है।

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

वैकल्पिक रूप से आप डेटा को खोलना शुरू कर सकते हैं।

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

(यदि आपके सिस्टम head -cको पहली बाइट नहीं निकालना है, तो head -n 1इसके बजाय पहली लाइन निकालने के लिए उपयोग करें।)


मुझे लगता LC_ALL=Cहै कि वहाँ यह सुनिश्चित करने के लिए है कि gzip हजार विभाजक संख्याओं में न डाले ताकि क्षेत्र की तुलना शून्य से की जा सके?
कैमरा

1
@camh: एक कमांड से आउटपुट को पार्स करने पर यह अधिक सामान्य व्यामोह होता है। यह संख्या स्वरूप हो सकता है, या यह कि किसी भाषा में दो हेडर लाइन, या कई अन्य चीजें हैं जिनके बारे में मैंने अभी सोचा नहीं है। गज़िप के मामले में, मुझे लगता है कि कुछ भी बुरा नहीं होता है, लेकिन LC_ALL=Cचोट नहीं पहुंचा सकता।
गिल्स एसओ- बुराई को रोकना '

1
यदि फ़ाइल में डेटा है लेकिन दूसरा विकल्प नहीं है तो दूसरा विकल्प विफल हो जाएगा; यह उस पंक्ति को भी प्रिंट नहीं करेगा जैसा readकि एक उपधारा में आमंत्रित किया जा रहा है (और $lineमाता-पिता के लिए प्रचारित नहीं किया गया है)।
क्रिस डाउन

1
@ क्रिसडाउन वेल स्पॉट किया गया। आपका फिक्स पर्याप्त नहीं है (साथ ही आपके द्वारा लिखा गया तरीका bash-only है)। यदि फ़ाइल अशक्त बाइट के साथ शुरू होती है, तो शेल (zsh के अलावा) को खाली स्ट्रिंग दिखाई देगी जब इसे नहीं करना चाहिए। trफिक्स के माध्यम से एक पाइप ।
गिल्स का SO-

4

यदि 'खाली' से आपका मतलब है कि असंपीड़ित फ़ाइल 0 बाइट्स है, तो आप gzip --list foo.gzअसम्पीडित फ़ाइल का आकार निर्धारित करने के लिए उपयोग कर सकते हैं , इसे स्वचालित करने के लिए कुछ पार्सिंग की आवश्यकता होगी। यह कुछ इस तरह दिखता है:

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

यह अनिवार्य रूप से उत्तर 1 है!
हेन्नो ब्रांडमा

1
... जो इस एक के बाद पोस्ट किया गया था।
jsbillings

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

या साथ if:

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

zcatकभी कभी से जुड़ा हुआ है gunzip -cया gzip -cd, आप छोटे "फार्म" के रूप में उपयोग करना चाहते हैं।


0

कृपया ध्यान दें कि gzip फ़ाइल प्रारूप केवल मूल फ़ाइल आकार को संग्रहीत करने के लिए 32 बिट्स की अनुमति देता है, इसलिए संख्या वहां आकार modulo 2 ^ 32 है। इसलिए "गज़िप-एल" द्वारा दिया गया आकार शून्यता के लिए एक निश्चित परीक्षा नहीं है।


2
आप इसे कैसे हल करेंगे, इसका एक उदाहरण सहित कृपया इसे और अधिक पूर्ण उत्तर दें।
जॉर्ज एम।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.