Làm cách nào để kiểm tra xem một tập tin được nén có trống không?


10

Có cách nào nhanh chóng để kiểm tra xem một tập tin được nén có trống không, hoặc tôi phải giải nén nó trước?

thí dụ:

$ 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

Câu trả lời:


8

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.)


Tôi giả sử 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?
CAMH

1
@camh: Đó là sự hoang tưởng chung hơn khi phân tích cú pháp định dạng đầu ra từ một lệnh. Nó có thể là định dạng số hoặc trong một số ngôn ngữ có hai dòng tiêu đề hoặc nhiều thứ khác tôi không nghĩ tới. Trong trường hợp của gzip, tôi nghĩ không có gì xấu xảy ra, nhưng LC_ALL=Ckhông thể làm tổn thương.
Gilles 'SO- ngừng trở nên xấu xa'

1
Sự thay thế thứ hai sẽ thất bại nếu tệp có dữ liệu nhưng không có dòng mới; nó cũng sẽ không in dòng như readđang được gọi trong một subshell (và $linekhông được truyền cho cha mẹ).
Chris Down

1
@ChrisDown Phát hiện tốt. Khắc phục của bạn là không đủ mặc dù (cộng với cách bạn viết nó chỉ là bash). Nếu tệp bắt đầu bằng byte rỗng, shell (không phải zsh) sẽ thấy một chuỗi trống khi không nên. Một đường ống thông qua trsửa chữa đó.
Gilles 'SO- ngừng trở nên xấu xa'

4

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

Đây thực chất là câu trả lời 1!
Henno Brandma

1
... đã được đăng sau cái này
jsbillings

2
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.


0

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.


2
Vui lòng đặt câu trả lời đầy đủ hơn bằng cách đưa ra ví dụ về cách bạn sẽ tiếp cận giải pháp.
George M
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.