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

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


답변

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대신 첫 번째 행을 추출하는 데 사용하십시오.


답변

‘빈’이라는 의미에서 압축되지 않은 파일이 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 비트 만 허용하므로 크기는 모듈로 2 ^ 32입니다. 그러므로 “gzip -l”에 의해 주어진 크기는 공허함을위한 결정적인 테스트가 아닙니다.