Как я могу проверить, пуст ли gzipped файл?

Это не прямой ответ на вопрос, но я влюбился в окно истории каталога в 4DOS. Так так, чтобы я записал свою собственную версию для Linux (и Cygwin). Я никогда не находил время для создания его легкая к установке утилита, но если Вы знаете свой путь вокруг подсказки Bash, не должно случаться так что трудно получить выполнение. Ваш вопрос вдохновил меня помещать его в Мерзавца repo и загружать его на GitHub: dirhistory.

В основном это - демон, который собирает изменения каталога из всех Ваших оболочек и программу Cdk, которая отображает историю и позволяет Вам выбрать любой каталог для переключения на (таким образом, Вы не ограничены стеком). Я нахожу это действительно полезным, и имею связанный с Ctrl-PageUp, точно так же, как 4DOS сделал. (Я даже исправил PuTTY, таким образом, он отправит Ctrl-PageUp в Bash.)

10
01.02.2011, 15:34
5 ответов

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 извлечь первую строку вместо этого.)

8
27.01.2020, 20:01
  • 1
    я принимаю LC_ALL=C там должен гарантировать, что gzip не вставляет тысячу разделителей в числах, таким образом, поле может сравниться с нулем? –  camh 01.02.2011, 22:36
  • 2
    @camh: это - более общая паранойя при парсинге отформатированного вывода от команды. Это мог быть числовой формат, или что на некотором языке существует две строки заголовка или много других вещей, о которых я просто не думал. В случае gzip я думаю, что ничего плохо не происходит, но LC_ALL=C не может причинить боль. –  Gilles 'SO- stop being evil' 02.02.2011, 01:44
  • 3
    , который приведет к сбою вторая альтернатива, если файл будет иметь данные, но не будет иметь новой строки; это также не распечатает строку как read вызывается в подоболочке (и $line не распространен к родителю). объяснение –  Chris Down 08.09.2012, 03:15
  • 4
    @ChrisDown Хорошо определяется. Ваша фиксация не достаточно, хотя (плюс путь Вы записали, что это только для удара). Если файл запустится с пустого байта, то оболочка (кроме zsh) будет видеть пустую строку, когда это не было должно. Канал через tr фиксирует это. –  Gilles 'SO- stop being evil' 08.09.2012, 14:44

Если 'пустым' Вы подразумеваете, что несжатый файл составляет 0 байтов, Вы могли использовать gzip --list foo.gz для определения размера несжатого файла это потребовало бы, чтобы некоторый парсинг автоматизировал его. Это выглядит примерно так:

$ gzip --list foo.gz
         compressed        uncompressed  ratio uncompressed_name
                 24                   0   0.0% foo
4
27.01.2020, 20:01
  • 1
    Это - по существу ответ 1! –  Henno Brandsma 02.02.2011, 11:14
  • 2
    ..., который был отправлен после этого. –  jsbillings 02.02.2011, 17:45
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, если Вы хотите использовать его в качестве более короткой "формы".

2
27.01.2020, 20:01

Обратите внимание на то, что gzip формат файла только позволяет 32 бита для хранения исходного размера файла, таким образом, число, там размер по модулю 2^32. Следовательно размер, данный "gzip-l", не является категорическим тестом для пустоты.

0
27.01.2020, 20:01
  • 1
    Сделайте это более полным ответом включением примера того, как Вы приблизились бы к решению. –  George M 05.07.2012, 16:01

Если размер файла gzip равен 51, он пуст. Всякий раз, когда я добавляю символ в файл и сжимаю файл, размер заархивированного файла начинает увеличиваться с 51.

Однако вы можете гарантировать это с помощью zcat. в gzip человек:

The uncompressed size is given as -1 for files not in gzip format, such as compressed.Z files. To get the uncompressed size for such a file, you can use:

zcat file.Z | wc -c
0
01.06.2021, 10:27

Теги

Похожие вопросы