ฉันจะตรวจสอบได้อย่างไรว่าไฟล์ 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 ไม่ได้ใส่ตัวคั่นเป็นพันเพื่อให้สามารถเปรียบเทียบฟิลด์กับศูนย์ได้หรือไม่
camh

1
@camh: มันเป็นความหวาดระแวงทั่วไปเมื่อแยกวิเคราะห์ผลลัพธ์ที่จัดรูปแบบจากคำสั่ง อาจเป็นรูปแบบตัวเลขหรือในบางภาษามีสองบรรทัดส่วนหัวหรือสิ่งอื่น ๆ อีกมากมายที่ฉันไม่ได้คิด ในกรณีของ gzip ฉันคิดว่าไม่มีอะไรเลวร้ายเกิดขึ้น แต่LC_ALL=Cไม่สามารถทำร้ายได้
Gilles 'หยุดความชั่วร้าย'

1
ทางเลือกที่สองจะล้มเหลวหากไฟล์มีข้อมูล แต่ไม่มีการขึ้นบรรทัดใหม่ มันจะไม่พิมพ์บรรทัดที่readถูกเรียกใน subshell (และ$lineไม่แพร่กระจายไปยังผู้ปกครอง)
Chris Down

1
@ChrisDown เห็นดี การแก้ไขของคุณยังไม่เพียงพอ (รวมถึงวิธีที่คุณเขียนว่าเป็นการทุบตีเท่านั้น) หากไฟล์เริ่มต้นด้วยไบต์ว่างเชลล์ (นอกเหนือจาก zsh) จะเห็นสตริงว่างเมื่อไม่ควรทำ ไปป์ที่ผ่านการtrแก้ไขนั้น
Gilles 'หยุดความชั่วร้าย'

4

หากโดย 'ว่างเปล่า' คุณหมายถึงว่าไฟล์ที่ไม่มีการบีบอัดเป็น 0 ไบต์คุณสามารถใช้gzip --list foo.gzเพื่อกำหนดขนาดของไฟล์ที่ไม่มีการบีบอัด ดูเหมือนว่า:

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

นี่คือคำตอบหลัก 1!
Henno Brandsma

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 ดังนั้นขนาดที่กำหนดโดย "gzip -l" จึงไม่ใช่การทดสอบที่ชัดเจนสำหรับความว่างเปล่า


2
โปรดทำให้เป็นคำตอบที่สมบูรณ์ยิ่งขึ้นโดยรวมถึงตัวอย่างของวิธีที่คุณจะเข้าหาโซลูชัน
George M
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.