มีวิธีที่รวดเร็วในการตรวจสอบว่าไฟล์ 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
มีวิธีที่รวดเร็วในการตรวจสอบว่าไฟล์ 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
คำตอบ:
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
ไม่สามารถทำร้ายได้
read
ถูกเรียกใน subshell (และ$line
ไม่แพร่กระจายไปยังผู้ปกครอง)
tr
แก้ไขนั้น
หากโดย 'ว่างเปล่า' คุณหมายถึงว่าไฟล์ที่ไม่มีการบีบอัดเป็น 0 ไบต์คุณสามารถใช้gzip --list foo.gz
เพื่อกำหนดขนาดของไฟล์ที่ไม่มีการบีบอัด ดูเหมือนว่า:
$ gzip --list foo.gz
compressed uncompressed ratio uncompressed_name
24 0 0.0% foo
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
ถ้าคุณต้องการใช้เป็น "แบบฟอร์ม" ที่สั้นลง
โปรดทราบว่ารูปแบบไฟล์ gzip อนุญาตให้ 32 บิตสำหรับการจัดเก็บขนาดไฟล์ต้นฉบับเท่านั้นดังนั้นตัวเลขที่มีขนาด modulo 2 ^ 32 ดังนั้นขนาดที่กำหนดโดย "gzip -l" จึงไม่ใช่การทดสอบที่ชัดเจนสำหรับความว่างเปล่า
LC_ALL=C
มีเพื่อให้แน่ใจว่า gzip ไม่ได้ใส่ตัวคั่นเป็นพันเพื่อให้สามารถเปรียบเทียบฟิลด์กับศูนย์ได้หรือไม่