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 -ctrích xuất byte đầu tiên, head -n 1thay vào đó hãy sử dụng để trích xuất dòng đầu tiên.)
LC_ALL=Ckhông thể làm tổn thương.
readđang được gọi trong một subshell (và $linekhông được truyền cho cha mẹ).
trsử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 -choặ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=Clà 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?