gzip으로 압축 된 파일이 비어 있는지 어떻게 확인할 수 있습니까?


10

gzip으로 압축 된 파일이 비어 있는지 확인하는 빠른 방법이 있습니까, 아니면 먼저 압축을 풀어야합니까?

예:

$ 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필드를 0과 비교할 수 있도록 gzip이 숫자에 천 단위 구분 기호를 넣지 않도록해야 한다고 가정 합니까?
camh

1
@ camh : 명령의 형식 출력을 구문 분석 할 때 더 일반적인 편집증입니다. 숫자 형식이거나 일부 언어에는 두 개의 헤더 행이 있거나 방금 생각하지 않은 많은 것들이있을 수 있습니다. gzip의 경우, 나는 나쁜 일이 없다고 생각하지만 LC_ALL=C상처를 줄 수는 없습니다.
Gilles 'SO- 악마 그만해'

1
파일에 데이터는 있지만 줄 바꿈이 없으면 두 번째 대안은 실패합니다. 또한 read서브 쉘에서 호출되는대로 행을 인쇄 $line하지 않으며 부모로 전파되지 않습니다.
Chris Down

1
@ChrisDown 잘 발견되었습니다. 그래도 당신의 수정은 충분하지 않습니다 (그리고 당신이 작성한 방식은 bash 전용입니다). 파일이 널 바이트로 시작하면 쉘 (zsh 이외)은 그렇지 않으면 빈 문자열을 보게됩니다. 파이프를 통해 tr수정합니다.
Gilles 'SO- 악한 중지'

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 비트 만 허용하므로 크기는 모듈로 2 ^ 32입니다. 그러므로 "gzip -l"에 의해 주어진 크기는 공허함을위한 결정적인 테스트가 아닙니다.


2
솔루션에 접근하는 방법의 예를 포함 시켜서보다 완벽한 답변을 작성하십시오.
George M
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.