4

Этот вопрос связан с вопросом библиотеки Crypto++ о переполнении стека: как добавить имя файла в архив при сжатии с использованием класса Gzip? ,

Gzip, как указано в RFC 1952, имеет необязательное поле для исходного имени файла:

  (if FLG.FNAME set)

     +=========================================+
     |...original file name, zero-terminated...| (more-->)
     +=========================================+

Если в поле флага установлен бит FNAME , то присутствует исходное имя файла.

Мы добавили эту функцию в Crypto++ и протестировали ее в OS X. В OS X, похоже, что программа gzip , Unarchiver (программа архивирования по умолчанию) и обозреватель архивов (покупка в App Store) не поддерживают исходное имя файла. То есть каждый файл распаковывается в имя файла, которое является именем архива без расширения gz ; а не оригинальное имя файла, как оно появляется в заголовке.

Например, вот изображение в браузере архивов. Исходное поле имени файла установлено в test-filename.txt , но инструмент показывает имя файла как gzip-test и распаковывает его в файл с именем gzip-test:

GZipGunzip) не являются стандартной Unix- командой IEEE, поэтому я не могу понять, где искать знания об ожидаемом поведении.

Это ожидаемое поведение? Или я вижу ошибку в трех разных программах?

Если это ожидается, то с какой практической целью служит оригинальное имя файла?

2 ответа2

4

Согласно справочной странице gzip, использование опции -N или --name при использовании gunzip восстанавливает исходное имя файла. -N является значением по умолчанию при сжатии (поэтому gzip всегда сохраняет исходное имя файла), но не при распаковке, поэтому его нужно явно использовать с gunzip .

Я проверил это следующим образом:

$ ls
test.txt

$ gzip test.txt
$ ls
test.txt.gz

$ mv test.txt.gz widget.gz

$ gunzip -N widget.gz
$ ls
test.txt

... что является результатом, который мы искали.

3

GZIP / Gunzip (версия 1.6 в Linux Mint / Ubuntu) не появляется , чтобы помнить или использовать оригинальные имена файлов, но это , видимо , можно. Мой первоначальный ответ, после некоторого базового тестирования, заключался в том, что он не сохранял имена файлов, но меня обманул вводящий в заблуждение вывод --list (вероятно, как и ОП).

Страница людей показывает , что он может сохранить и использовать исходное имя файл, но даже при создании .gz файла с -N or --name вариантом, при перечислении -l содержимое , что файл .gz в uncompressed_name колонке перечислены текущее имя файла "база".

$ echo test > t1
$ gzip -vkN t1
t1: -40.0% -- replaced with t1.gz

$ gzip -vl t1.gz 
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 3bb935c6 Jan  3 14:59                  28                   5 -40.0% t1

$ cp t1.gz N1.gz
$ gzip -vl N1.gz 
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 3bb935c6 Jan  3 15:04                  28                   5 -40.0% N1

Если вы не используете опцию -N при тестировании / листинге, то он показывает оригинальное имя файла

$ gzip -vlN t1.gz 
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 3bb935c6 Jan  3 14:59                  28                   5 -40.0% t1
$ gzip -vlN N1.gz 
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 3bb935c6 Jan  3 14:59                  28                   5 -40.0% t1

Распаковка без использования опции -N также не восстанавливает исходное имя файла,

Я не думал, что gzip когда-либо сохранял или использовал исходное имя файла, это скорее сжатие "один файл за раз", часто используемое для файлов .tar, когда tar сохраняет несколько файлов и их имен, полезность сохранения имен gzip кажется ограниченной ,

Другие сжатые форматы архивов, такие как .zip, .7z, также запоминают имена файлов, поскольку они архивируют и сжимают несколько файлов, они похожи на .tar.gz в одном.

Говоря о крипто, gpg может запомнить и использовать оригинальные имена файлов (определенно, когда он использует симметричное шифрование -c для одного файла, должно работать и для шифрования с открытым ключом).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .