Подтвердить что ты не робот

Быстрая слияние нескольких файлов GZip

У меня есть список файлов gzip:

file1.gz
file2.gz
file3.gz

Есть ли способ объединить или gzipping эти файлы в один файл gzip без необходимости распаковывать?

На практике мы будем использовать это в веб-базе данных (CGI). Где сеть будет получать запрос пользователя и список всех файлов, основанных на запросе, и представить их в пакетном файле обратно пользователю.

4b9b3361

Ответ 1

С помощью файлов gzip вы можете просто объединить файлы, например, так:

cat file1.gz file2.gz file3.gz > allfiles.gz

Согласно gzip RFC,

GZIP файл состоит из серии "членов" (сжатых наборов данных). [...] Участники просто появляются один за другим в файле, без дополнительной информации до, между или после них.

Обратите внимание, что это не совсем то же самое, что создание единого gzip файла из объединенных данных; среди прочего, все оригинальные имена файлов сохраняются. Тем не менее, Gunzip, кажется, обрабатывает его как эквивалент конкатенации.

Поскольку существующие инструменты, как правило, игнорируют заголовки файлов для дополнительных элементов, невозможно легко извлечь отдельные файлы из результата. Если вы хотите, чтобы это было возможно, вместо этого создайте ZIP файл. ZIP и GZIP оба используют алгоритм DEFLATE для фактического сжатия (ZIP поддерживает некоторые другие алгоритмы сжатия, а также опцию - метод 8 соответствует алгоритму сжатия GZIP); Разница заключается в формате метаданных. Поскольку метаданные несжатые, достаточно просто убрать заголовки gzip и вместо них прикрепить заголовки ZIP файлов и запись центрального каталога. Обратитесь к спецификации формата gzip и спецификации формата ZIP.

Ответ 2

Вот что man 1 gzip говорит о вашем требовании.

Несколько сжатых файлов могут быть объединены. В этом случае gunzip извлечет всех участников сразу. Например:

gzip -c file1  > foo.gz
gzip -c file2 >> foo.gz

Тогда

gunzip -c foo

эквивалентно

cat file1 file2

Излишне говорить, что file1 можно заменить на file1.gz.

Вы должны заметить это:

gunzip извлечет всех участников сразу

Поэтому, чтобы собрать всех участников по отдельности, вам придется использовать что-то дополнительное или написать, если вы хотите это сделать.

Однако об этом также говорится на странице справки.

Если вы хотите создать один архивный файл с несколькими членами, чтобы впоследствии их можно было извлекать независимо, используйте архиватор, такой как tar или zip. GNU tar поддерживает опцию -z для прозрачного вызова gzip. gzip разработан как дополнение к tar, а не как замена.

Ответ 3

Просто используйте cat. Это очень быстро (0,2 секунды для 500 МБ для меня)

cat *gz > final
mv final final.gz

Затем вы можете прочитать результат с помощью zcat, чтобы убедиться в этом:

zcat final.gz

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

PV:

Еще лучше, если у вас есть это, "pv" вместо cat:

pv *gz > final
mv final final.gz

Это дает вам индикатор выполнения, поскольку он работает, но делает то же самое, что и cat.

Ответ 4

Вы можете создать tar файл этих файлов, а затем gzip tar файл для создания нового файла gzip

tar -cvf newcombined.tar file1.gz file2.gz file3.gz
gzip newcombined.tar