Respostas:
gzip -l foo.gz | awk 'NR==2 {print $2}'
imprime o tamanho dos dados não compactados.
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
Como alternativa, você pode começar a descompactar os dados.
if [ -n "$(gunzip <foo.gz | head -c 1 | tr '\0\n' __)" ]; then
echo "foo is not empty"
else
echo "foo is empty"
fi
(Se o seu sistema não precisar head -c
extrair o primeiro byte, use head -n 1
para extrair a primeira linha.)
LC_ALL=C
não pode machucar.
read
está sendo chamada em um subshell (e $line
não é propagada para o pai).
tr
que conserta isso.
Se por 'vazio' você quer dizer que o arquivo descompactado é de 0 bytes, você pode usar gzip --list foo.gz
para determinar o tamanho do arquivo descompactado, seria necessária uma análise para automatizá-lo. Parece algo como isto:
$ gzip --list foo.gz
compressed uncompressed ratio uncompressed_name
24 0 0.0% foo
Observe que o formato do arquivo gzip permite apenas 32 bits para armazenar o tamanho do arquivo original, portanto, o número do módulo 2 é 32 ^. Portanto, o tamanho dado por "gzip -l" não é um teste definitivo para o vazio.
LC_ALL=C
está lá para garantir que gzip não põe em separadores de milhar nos números de modo que o campo pode ser comparado a zero?