Як я можу перевірити, чи gzipped файл порожній?


10

Чи є швидкий спосіб перевірити, чи gzipped файл порожній, чи я мушу розпакувати його спочатку?

приклад:

$ 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чи є для того, щоб gzip не ставив тисячі роздільників у числах, щоб поле можна порівняти з нулем?
camh

1
@camh: Це більш загальна параноїя при аналізі відформатованого виводу з команди. Це може бути формат чисел, або те, що в якійсь мові є два рядки заголовка, або багато інших речей, про які я просто не думав. У випадку gzip, я думаю, нічого поганого не відбувається, але LC_ALL=Cне можу зашкодити.
Жил "ТАК - перестань бути злим"

1
Друга альтернатива вийде з ладу, якщо файл має дані, але не має нового рядка; він також не надрукує рядок, як readвикликається в підшлубку (і $lineне поширюється на батьківський).
Кріс Даун

1
@ChrisDown Добре помічений. Хоча виправлення недостатньо (плюс те, як ви написали, це лише башти). Якщо файл починається з нульового байта, оболонка (крім zsh) побачить порожній рядок, коли він не повинен. Труба через trвиправлення, що.
Жил "ТАК - перестань бути злим"

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
Будь ласка, зробіть це більш повною відповіддю, включивши приклад того, як ви б підійшли до рішення.
Джордж М
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.