Архивация группы gzip-файлов

У меня есть группа из примерно 10 gzip-файлов, которые я хотел бы заархивировать в один файл, чтобы пользователь мог их загрузить. Мне интересно, какой лучший подход к этому будет.

  1. Заархивируйте все, затем tar-gz полный набор файлов в myfiles.tar.gz?
  2. Тарируйте набор файлов gz в файл myfiles.tar.

Вариант 1, по-видимому, содержит ненужные шаги, поскольку исходные файлы уже сжаты.

Вариант 2 кажется запутанным, поскольку нет никаких указаний на то, что файлы внутри архива действительно сжаты.

Как обычно люди архивируют группу уже сжатых файлов?

Я использую Python (если это имеет значение), но я выполняю операции через выполнение оболочки.


person Brett    schedule 18.07.2016    source источник
comment
Вариант 1 будет лучше, если вы хотите, чтобы конечный пользователь один раз распаковал gz и получил необходимые файлы. Вариант 2 будет для вас более простым, но конечному пользователю придется разархивировать, а затем заархивировать отдельные gz-файлы.   -  person Fazlin    schedule 18.07.2016


Ответы (2)


Сжатый tar-архив не является архивом сжатых файлов. Это сжатый архив файлов. Напротив, zip-архив представляет собой архив сжатых файлов.

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

Поскольку основной вариант использования gzip-архивов tar — это передача полных репозиториев, а весь архив обычно распаковывается сразу, тот факт, что невозможно распаковать и извлечь отдельный файл [Примечание 1], не требует больших затрат. С другой стороны, улучшенная степень сжатия приносит заметную пользу.

Чтобы ответить на вопрос, единственный способ объединить несколько tar-архивов, сжатых gzip, - это распаковать их все, объединить их в один tar-архив, а затем повторно сжать результат; вариант 1 в исходном сообщении.

Примечания

  1. Конечно, вы можете распаковать весь архив и извлечь один файл из распакованного потока; нет необходимости сохранять результат распаковки. Утилита tar сделает это прозрачно. Но под капотом распаковывается сам архив. Невозможно даже перечислить содержимое tar-архива, сжатого с помощью gzip, без распаковки всего архива.
person rici    schedule 18.07.2016

Gzip-архив несжатых файлов — это, безусловно, то, что нужно вашим пользователям. Поскольку вы используете Python, вы можете пропустить обстрел и сделать все немного чище (IMO). Он использует tarfile и gzip.GzipFile для обработки частей архивации и сжатия.

Примечание от редакции. При написании этой статьи я наткнулся на интересную ошибку, о которой, возможно, вам следует знать: https://blog.nelhage.com/2010/02/a-very-subtle-bug./

from __future__ import with_statement  # god I hope you don't need this
import gzip
import sys
import tarfile
try:
    import io
except ImportError:  # makes things work before Python 3
    import StringIO as io

with tarfile.open(sys.argv[1], mode='w:gz') as archive:
    for name in sys.argv[2:]:
        with gzip.GzipFile(name) as gzip_file:
            buf = io.StringIO()
            buf.write(gzip_file.read())
            buf.seek(0)

            info = archive.gettarinfo(name)
            if info.name.endswith('.gz'):
                info.name = info.name[:-3]
            info.size = buf.len
            archive.addfile(info, fileobj=buf)

Теперь я, вероятно, не стал бы этого делать, если несжатые файлы большие, так как он будет считывать каждый из них в память как кусок. Это хорошо тем, что он сохраняет атрибуты файла, такие как права доступа, время и многое другое, чего нет в файле архива.

person D.Shawley    schedule 18.07.2016