Câu trả lời:
gzip -l foo.gz | awk 'NR==2 {print $2}'
in kích thước của dữ liệu không nén.
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
Ngoài ra, bạn có thể bắt đầu giải nén dữ liệu.
if [ -n "$(gunzip <foo.gz | head -c 1 | tr '\0\n' __)" ]; then
echo "foo is not empty"
else
echo "foo is empty"
fi
(Nếu hệ thống của bạn không phải head -c
trích xuất byte đầu tiên, head -n 1
thay vào đó hãy sử dụng để trích xuất dòng đầu tiên.)
LC_ALL=C
không thể làm tổn thương.
read
đang được gọi trong một subshell (và $line
không được truyền cho cha mẹ).
tr
sửa chữa đó.
Nếu 'trống', bạn có nghĩa là tệp không nén là 0 byte, bạn có thể sử dụng gzip --list foo.gz
để xác định kích thước của tệp không nén, nó sẽ yêu cầu một số phân tích cú pháp để tự động hóa nó. Nó trông giống như thế này:
$ gzip --list foo.gz
compressed uncompressed ratio uncompressed_name
24 0 0.0% foo
test -z $(gzip -cd foo.gz | head -c1) && echo "empty"
Hoặc với if
:
if [ -z $(gzip -cd foo.gz | head -c1) ]; then
echo "empty"
fi
zcat
đôi khi được liên kết đến gunzip -c
hoặc gzip -cd
, nếu bạn muốn sử dụng nó dưới dạng "mẫu" ngắn hơn.
Xin lưu ý rằng định dạng tệp gzip chỉ cho phép 32 bit để lưu trữ kích thước tệp gốc, do đó, số có kích thước modulo 2 ^ 32. Do đó, kích thước được đưa ra bởi "gzip -l" không phải là một thử nghiệm rõ ràng cho sự trống rỗng.
LC_ALL=C
là có để đảm bảo rằng gzip không đặt hàng nghìn dấu phân cách vào số để trường có thể được so sánh bằng không?