Ответы:
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
не повредит.
read
которая вызывается в подоболочке (и $line
не распространяется на родительский объект ).
tr
исправляет.
Если под «пустым» вы подразумеваете, что несжатый файл имеет gzip --list foo.gz
размер 0 байт, вы можете использовать его для определения размера несжатого файла, для его автоматизации потребуется некоторый анализ. Это выглядит примерно так:
$ gzip --list foo.gz
compressed uncompressed ratio uncompressed_name
24 0 0.0% foo
Обратите внимание, что формат файла gzip позволяет хранить только 32 бита для хранения исходного размера файла, поэтому число там равно модулю 2 ^ 32. Следовательно, размер, указанный в «gzip -l», не является окончательным тестом на пустоту.
LC_ALL=C
что gzip не помещает тысячи разделителей в числа, чтобы поле можно было сравнить с нулем?