Відповіді:
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
виправлення, що.
Якщо під "порожнім" ви маєте на увазі, що нестиснений файл становить 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", не є остаточним тестом на порожнечу.
LC_ALL=C
чи є для того, щоб gzip не ставив тисячі роздільників у числах, щоб поле можна порівняти з нулем?