Tar удалить файлы после архивации
Есть известная поговорка, что системные администраторы делятся на три типа: тех, кто не делает бэкапы; тех, кто уже делает бэкапы и тех, кто делает и проверяет, что бэкапы рабочие.
Однако этого недостаточно, и сейчас для пользователя системы бэкапов важен такой параметр как скорость, причём не только скорость самого бэкапа, то есть архивирования файлов, но и восстановления.
Согласитесь, ведь глупо считывать целиком весь архив размером в 50-100-1000 гигабайт, чтобы извлечь один файл.
А если у вас эти архивы инкрементальные, то чтобы восстановить один файл за нужную дату, нужно будет последовательно читать все архивы по порядку. И всё становится намного хуже, если файл архива расположен на удалённом сервере.
И именно этим вы будете заниматься, если будете использовать формат архива TAR. Ведь это промышленный стандарт для архивов, и он используется во многих утилитах для бэкапа.
И причина такого поведения очень проста — отсутствие индексов, по которым можно вытащить один файл из архива.
У TAR вообще много недостатков, многие из них — фатальные. Я приведу небольшой список основных недостатков, на которые натолкнулся за время исследования:
И это только то, что я вспомнил с ходу.
Я провёл достаточно обширное исследование архиваторов (zip, rar, 7zip) и даже всяких монструозных систем для бэкапов: опенсорсных (ну или условно опенсорсные) типа bacula, и проприетарных.
И нашёл формат архива, который меня и компанию более или менее устроил по всем параметрам и подходил к моей задаче.
Я предлагаю вам обратить внимание на архиватор dar и коротко расскажу о его преимуществах и недостатках (они есть, но их немного, и с ними можно жить), а потом перейду к практическим примерам.
Достоинства
- У файла архива есть индекс, и даже больше — сам индекс можно разместить отдельно и забэкапить, что позволит восстановить архив, если у него был повреждён индекс.
- Не только привычные дифференциальный и инкрементальный бэкапы, но и декрементальный.
- Шифрование (blowfish, aes, twofish, serpent, camelia).
- Можно сжимать файлы с определёнными расширениями.
- Можно не сжимать файлы с определёнными расширениями.
- Можно гибко управлять процессом архивации и разархивации (как реагировать на удаление файлов, на изменение, перемещение и пр.).
- Есть поставляемый с dar менеджер архивов, он позволяет не восстанавливать все архивы подряд при поисках файла, автоматически выбирая только нужные.
Это только основные его преимущества, вообще dar очень богат на фичи и об этом лучше всего говорит цитата из man: «. But due to the lack of available unused letter for command line options. ».
Проект достаточно активно развивается и хорошо поддерживается разработчиком. На свои вопросы я получал ответ в течении пары дней, причём ответы всегда очень содержательны. Я знаю только один проект с таким же уровнем поддержки — libguestfs, к слову, я про него уже писал.
Недостатки
- Нереальное количество опций, а если всерьёз закапываться в то, как реагировать на различные изменения файлов при архивации/разархивации — свихнуться можно.
- Совершенно неочевидный процесс архивации/восстановления через пайп (например, по ssh).
- В определённых ситуациях dar может потребовать реакции пользователя (это решается через добавление аргументов к команде, но, как правило, эта интерактивность проявляется очень неожиданно, особенно пока вы пишете свои первые скрипты с dar).
Не то, чтобы это недостаток, но dar очень многословен. Если tar после выполнения операции напишет одну строчку, то dar пишет очень много и очень подробно. И конечно, его можно заткнуть (ещё никто не избегал >/dev/null 2>&1 ).
Практикум
Я готов поспорить, что часть аудитории уже побежала устанавливать dar в своих любимых дистрибутивах и читать man'ы самостоятельно. Для тех же, кто остался, я расскажу как им пользоваться. А когда энтузиасты вернутся, я покажу, как пользоваться этой замечательной утилитой, и расскажу о некоторых базовых понятиях, которые вы встретите на страницах man dar .
Архивирование
Первый пример, самый простой:
dar -R $HOME -c /mnt/backup/archive
Архивирует директорию /home.
Давайте исключим пару директорий (~/movies, ~/downloads):
dar -R $HOME -c /mnt/backup/archive -P movies -P downloads
Я думаю, все уже заметили, что название архива никак не упоминает расширение файла .dar. А ещё в имени файла откуда-то взялась цифра 1. Это всё потому, что dar изначально предназначается для бэкапа на сменные носители (CD, DVD или, например, ленточные накопители), поэтому он архивирует в слайсы, а циферка 1 возникает потому, что этот слайс первый. А поскольку мы не указывали ключик -s 100M — и единственный. У dar есть также ключи для запуска скриптов, при выполнении определённых операций (такие ключи есть и у tar). Например, когда слайс записан, можно выполнить скрипт и поменять носитель, а потом ещё раз и так далее.
В общем, разбитием архива на несколько частей никого не удивишь.
По умолчанию dar архивирует без сжатия, и чтобы включить сжатие нужно передать ему ключик -z algo:level . Поддерживаются gzip, bzip2, lzo. И на выходе мы получим такой же файл .N.dar, без добавления всяких .gz и прочих. Архиватор сам знает что у него внутри.
Перейдём к следующей вкусности — исключениям для сжатия при архивации:
dar -R $HOME -c /mnt/backup/archive -Y "*.txt" "*.fb2" -Z "*.mp4"
Ключ -Y указывает для каких файлов нужно включать компресию, а -Z — для каких не нужно. Причём по умолчанию исключение имеет более высокий приоритет (но это поведение можно поменять при необходимости).
А теперь приступим к дифференциальному, инкрементальному и самому вкусному — декрементальному бэкапу.
Если кто-нибудь не знает, что это означает — нестрашно, я расскажу:
- Дифференциальный: сначала создаётся полная копия, а каждый последующий день сохраняется только разница между этой копией и текущим состоянием файлов.
- Инкрементальный: создаётся полная копия, на следующий день сохраняется разница между полной и текущим состоянием, на третий — разница между вторым днём и третьим.
- Декрементальный: каждый день сохраняется полная копия и сохраняется разница между текущим состоянием и вчерашним.
При этом вам никто не мешает реализовывать одновременно и инкрементальный, и декрементальный бэкап. Так что за две недели бэкап может выглядеть так (сверху дни недели, снизу тип бэкапов d- — декрементальный, +i — инкрементальный):
M T W T F S S M T W T F S
d- d- d- d- d- d- f +i +i +i +i +i +i
Что позволит обойтись одной полной копией, сэкономив существенное количество места.
Следует также знать, что единственным, что вам понадобится для того чтобы сделать инкрементальный архив — индекс. В терминах dar индекс называется каталогом, а сохранение индекса в файл — изоляцией каталога. Также я далее буду использовать только термины инкрементальный/декрементальный, поскольку дифференциальный архив — частный случай инкрементального
Итак, давайте создадим инкрементальный архив:
dar -R $HOME -c /mnt/backup/archive_monday -A /mnt/backup/archive
А теперь сделаем ещё один:
dar -R $HOME -c /mnt/backup/archive_tuesday -A /mnt/backup/archive_monday
Идею поняли? Отлично, едем дальше. А сейчас давайте сохраним индекс отдельно (обратите внимание, мы его не вырежем из архива, а просто скопируем, это как с бэкапом mbr. Вы ведь делаете бэкап своего загрузчика?), чтобы потом не ворочать многогигабайтным бэкапом только ради создания инкрементного архива. Мы делаем сейчас «изоляцию на лету», но каталог можно сохранить в любое удобное время, взяв его из готового архива.
dar -R $HOME -c /mnt/backup/archive_wednesday -A /mnt/backup/archive_tuesday -@ /mnt/backup/CAT_archive_wednesday
А теперь давайте сделаем бэкап ещё разок, используя только индекс CATarchivewednesday:
dar -R $HOME -c /mnt/backup/archive_thursday -A /mnt/backup/CAT_archive_wednesday -@ /mnt/backup/CAT_archive_thursday
Отлично, мы разобрались со знакомым многим инкрементальным бэкапом, но что такой за зверь декрементальный бэкап?
Для начала нам нужен один вчерашний полный архив из которого мы будем делать декрементальный, и сегодняшний полный.
dar -R $HOME -c /mnt/backup/archive_sunday
dar -R $HOME -+ /mnt/backup/archive_saturday_decremental -A /mnt/backup/archive_saturday -@ /mnt/backup/archive_sunday -ad
Вообще, тут немного всё запутано (привыкайте), поскольку -+ по документации создан для объединения двух архивов, а -@ , как мы уже говорили, служит для изоляции каталога «на лету», и ключ -ad меняет поведение этих ключей, чтобы реализовать декремент. В некотором смысле это логично. Наверное.
Ну вот мы и подобрались к моменту истины — восстановлению данных. Ведь все понимают, что сделанный бэкап, который нельзя восстановить, равносилен несделанному бэкапу?
Перед восстановлением было бы неплохо проверить архив:
dar -t /mnt/backup/archive_sunday
Если dar не вернул код ошибки (в конце man'а перечислены все возможные коды выхода, которые dar может вернуть), то можно восстанавливать:
mkdir sunday
dar -x /mnt/backup/archive_sunday -R sunday
Операции на удалённых машинах
Восстановление файлов
Я вскользь уже упоминал, что восстановление файлов с удалённых машин, через пайп (например, по ssh) является нетривиальной задачей.
Попробую подробно рассказать как это работает.
Все сложности связаны с тем, что для восстановления одного файла dar нужно читать индекс. Если же использовать его аналогично tar, в режиме потокового чтения (ключ --sequential-read), то таких проблем не возникает.
Для решения проблемы с чтением индекса создано две версии dar:
- Основная: dar, которая говорит, что нужно восстановить.
- Вспомогательная: dar_slave, которая принимает команду и передаёт dar восстановленные данные, которые dar потом записывает на диск.
Поэтому схема работы (для восстановления) выглядит так:
(2) --> dar --> (1) --> dar_slave archive --> (2)
- dar через пайп говорит dar_slave: «Хочу восстановить файл А».
- dar_slave считывает индекс файла archive, узнаёт, по какому смещению находится искомый файл, и передаёт его на stdout, который читает dar и пишет полученный файл на диск.
Сложность заключается в том, чтобы осуществить передачу файла от dar_slave в dar. Для такой «кольцевой» передачи данных нам придётся соорудить небольшой костыль при помощи mkfifo:
mkfifo /tmp/fifo
dar -x -i /tmp/fifo -R sunday | ssh user@host dar_slave sunday > /tmp/fifo
rm /tmp/fifo
Этих проблем можно избежать, если монтировать удалённую директорию, например, по NFS.
Упаковка файлов
При упаковке файлов тоже есть небольшая хитрость: нужно обязательно сохранять файл индекса архива на локальной машине, чтобы на его основе можно было строить инкрементальные архивы:
dar -R $HOME -c - -A /mnt/backup/CAT_archive_wednesday -@ /mnt/backup/CAT_archive_thursday | ssh user@host 'cat > archive_thursday'
Разные приятности
Также в комплекте с dar идёт утилита под названием dar_manager, которая является обёрткой на стероидах над dar. По сути, это приложение, которое, оперируя полученными из архивов индексами, позволяет упростить жизнь при восстановлении данных (например, не придётся копаться в сотне архивов, чтобы найти, откуда можно будет восстановить нужный файл).
Я ей не особо пользовался, только запускал пару раз, чтобы понять для чего и как она используется.
Также в комплекте с dar идёт dar_static: статически скомпилированый бинарник, который никогда не будет лишним положить рядом с архивами.
Важное замечание
Поскольку утилита достаточно активно разрабатывается, у неё есть периодически возникающие проблемы (которые оперативно решаются в списке рассылки), и в связи с этим в дистрибутивах почти всегда присутствует неактуальная версия dar. Например в Ubuntu 12.04 используется, если не ошибаюсь dar версии 2.4.2, которая не может создать/восстановить архив в некоторых специфичных условиях. С dar версии 2.4.12 лично у меня никаких проблем нет.
Также стоит отметить, что архивы, сделанные версией 2.4, скорее всего не будут распаковываться dar версии 2.3 ввиду изменения формата архива.
Утилита командной строки tar используется для работы с архивами в операционных системах на базе UNIX. С ее помощью можно архивировать данные и оптимизировать использование дискового пространства.
Создание и распаковка архивов
Рассмотрим общий синтаксис для создания и распаковки архивов.
Создать
Создание выполняется с ключом c. Синтаксис следующий:
tar -czvf archive.tar.gz /home/dmosk
* в данном примере будет создан архив archive.tar.gz домашней директории пользователя (/home/dmosk)
** где z — сжать архив в gzip (без этого параметра, tar не сжимает, а создает так называемый тарбол); c — ключ на создание архива; v — verbose режим, то есть с выводом на экран процесса (очень удобно для наблюдением за ходом работы, но в скриптах можно упустить); f — использовать файл (обязательно указываем, так как в большей степени работаем именно с файлами).
Распаковать
Распаковка выполняется с ключом x с синтаксисом:
tar -xvf archive.tar.gz
Форматы
Утилита tar позволяет работать с архивами различных форматов. Рассмотрим их кратко.
Распаковка .gz файла:
tar -xvf archive.tar.gz
* при возникновении ошибки This does not look like a tar archive, можно воспользоваться командой gzip -d archive.tar.gz.
tar -xvjf archive.tar.bz2
* ключ j отвечает за работу с bz2.
Если система ругается на bzip2, значит нужно его установить:
yum install bzip2
apt-get install bzip2
pkg install bzip2
* соответственно, для CentOS (RPM based), Ubuntu (deb based), FreeBSD (BSD based).
Если видим ошибку tar: Unrecognized archive format, воспользуемся следующей командой:
bzip2 -d archive.tar.bz2
tar -xvzf archive.tar.gzip
* ключ z отвечает за работу с gzip.
Распаковывается, как gzip:
tar -xvzf archive.tgz
Это формат сжатия данных с помощью алгоритма LZMA. Для работы с ним устанавливаем:
apt install xz-utils
* на Debian / Ubuntu.
* на Rocky Linux / CentOS.
Теперь можно пользоваться.
tar -cpJf archive.tar.xz /home/user
tar -xpJf archive.tar.xz
Примеры
Распаковать в определенную папку
tar -C /home/user -xvf archive.tar.gz
* ключ -C используется для указания папки, куда необходимо распаковать файлы из архива.
Распаковка без вложенной папки
Такой способ можно использовать для распаковки в заранее подготовленный каталог. Будет некий эффект переименовывания каталога или аналог «Распаковать здесь»:
tar -C /home/admin/mytar -xvf admin.tar.gz --strip-components 1
* каталог /home/admin/mytar заранее должен быть создан; --strip-components 1 пропустит одну вложенную папку внутри архива.
Исключение файлов по маске
Если необходимо пропустить некоторые файлы, вводим команду с ключом --exclude:
tar --exclude='sess_*' -czvf archive.tar.gz /wwwsite
* в данном примере мы создадим архив archive.tar.gz, в котором не будет файлов, начинающихся на sess_.
Также можно исключить несколько файлов или папок, добавляя несколько опций exclude:
* в данном примере мы исключим папку recycle и файлы, которые заканчиваются на .tmp
Работа с архивами, разбитыми на части
Разбить архив на части может понадобиться по разным причинам — нехватка места на носителе, необходимость отправки файлов по почте и так далее.
Чтобы создать архив, разбитый на части, вводим команду:
tar -zcvf - /root | split -b 100M - root_home.tar.gz
* данная команда создаст архив каталога /root и разобьет его на части по 100 Мб.
В итоге мы получим, примерно, такую картину:
root_home.tar.gzaa root_home.tar.gzac root_home.tar.gzae
root_home.tar.gzag root_home.tar.gzai root_home.tar.gzab
root_home.tar.gzad root_home.tar.gzaf root_home.tar.gzah
Чтобы собрать архив и восстановить его, вводим команду:
cat root_home.tar.gz* | tar -zxv
Описание ключей tar
Команды для действия
Ключ | Описание |
---|---|
-A | Добавление файлов в архив. |
-c | Создание нового архивного файла. |
-d | Показать отличающиеся данные между каталогом-исходником и содержимым архива. |
--delete | Удалить файлы внутри архива. |
-r | Добавить файлы в конец архива. |
-t | Показать содержимое архива. |
-u | Добавить файлы, которых нет в архиве. |
-x | Извлечь файлы из архива. |
* нельзя использовать несколько вышеперечисленных ключей в одной команде.
Дополнительные опции
Ключ | Описание |
---|---|
--atime-preserve | Оставить прежнюю метку времени доступа для файла. |
-b N | Задать размер блока N x 512. |
-C | Смена каталога. По умолчанию, используется тот, в котором мы находимся. |
--checkpoint | Показать имена папок при чтении архивного файла. |
-G | Использование старого формата инкрементального резервирования при отображении или извлечения. |
-g | Использование нового формата инкрементального резервирования при отображении или извлечения. |
-h | Не дублировать символьные ссылки. Только файлы, на которые указывают эти симлинки. |
-i | Игнорировать блоки нулей. |
-j | Использование bzip2. |
--ignore-failed-read | Игнорировать не читаемые файлы. |
-k | При распаковке, существующие файлы не заменяются соответствующими файлами из архива. |
-L N | Смена магнитной ленты после N*1024 байт. |
-m | При извлечении игнорировать время модификации объекта. |
-M | Многотомные архивы. |
-N DATE | Сохранять только более новые файлы относительно DATE |
-O | Направление извлекаемого на стандартный вывод. |
-p | Извлечение защищенной информации. |
-P | Не отбрасывает начальный слэш (/) из имен. |
-s | Сортировка файлов при извлечении. |
--preserve | Аналогично -ps |
--remove-files | Удалить исходные файлы после добавления в архив. |
--same-owner | Сохранить владельца при извлечении. |
--totals | Вывод байт при создании архива. |
-v | Протоколирование действий — отображение списка объектов, над которыми происходит действие. |
-V NAME | Создание архива на томе с меткой NAME. |
--version | Показать версию tar. |
-w | Требовать подтверждения для каждого действия. |
-W | Проверка архива после записи. |
--exclude FILE | Исключить файл FILE. |
-X FILE | Исключить файлы FILE. |
-Z | Фильтрует архив с помощью compress. |
-z | Использование gzip. |
* актуальный список опций можно получить командой man tar.
Tar не работает с zip-архивами. В системах UNIX для этого используем утилиты zip и unzip. Для начала, ставим нужные пакеты:
yum install zip unzip
apt-get install zip unzip
pkg install zip unzip
* соответственно, для RPM based, deb based, BSD based.
zip -r archive.zip /home/dmosk
* создает архив каталога /home/dmosk в файл archive.zip.
Windows
В системе на базе Windows встроенными средствами можно распаковать только ZIP-архивы. Для работы с разными архивами рекомендуется поставить архиватор, например 7-Zip.
I have a large file foo.tar.xz that contains a lot (say 200000) of files. I figured out that this archive contains some (around 5000) files I don't want. I don't have sufficient disk space to decompress the whole thing onto my disk; additionally, I fear attributes / rights might get lost if I do so. I have enough space to host two copies of the compressed archive though. Is there a tool to remove some of the files from the archive (specified with a regex on the filename) on-the-fly, i.e. without unpacking the archive into individual files?
3 Answers 3
Use it like this, for example:
Also, the operation will be rather slow in any case, due to the (by design) packed linear nature of tar archives.
It does exist, but it doesn't work with files where random access is not possible (e.g. compress archives) but this is my use-case.
The other problem is that I cannot specify a pattern to delete. Note my comment from 2013 where I already address the shortcomings of gtar --delete .
@FUZxxl -T works with --delete , and --wildcards allows you to use patterns rather than filenames, so create a temporary file containing the patterns and use unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz >file2.tar.xz . It won't do a full regex (if you need that, just use tar -t and build up a list of filenames to delete), just filename matching patterns.
(edited, as I misunderstood the question, which was since edited also)
The best you can do is to extract, delete, and recompress the entire file.
It's not possible to delete files from a tar directly.
tar is a stream, originally intended for tape drives which do not do random seeks well - while in theory it could be possible on a disk filesystem to punch a hole / rewrite the remaining file, with compression the point is moot as most if not all compression methods heavily depend on contents that occured earlier in the file. In order to do this in place you would need very detailed knowledge about both the compression method as well as the tar file format. That's complexity to a point no one would even bother with it. It's cheaper to just keep the files around and ignore them.
Может ли GNU tar добавить много файлов в архив, удаляя каждый из них по мере добавления?
Это полезно, когда на диске недостаточно места для хранения как всего tar-архива, так и исходных файлов, и поэтому нет возможности просто вручную удалить файлы после создания архива обычным способом.
задан 28 мая '12, 09:05
ВСЕ ли файлы, существующие в каталоге, должны быть сжаты? - Eugene S
не man tar ответьте на ваш вопрос? - lanzz
да, у меня есть каталог с именем images. Я делал tar cvjf images.tar.bz2 images/, но мне не хватило места на диске. - Ivy
Одно из решений может состоять в том, чтобы сделать ftp для целых файлов на другой машине --> заархивировать его --> затем вернуть «заархивированные файлы» на ту же машину - Pradeep
Я бы предпочел этого не делать, так как файлов много, и мне может понадобиться сделать это снова с еще большим количеством - Ivy
4 ответы
С GNU tar используйте вариант --remove-files .
ответ дан 21 дек '18, 03:12
Вы уверены, что использование этого флага удалит каждый файл после его добавления в архив, а не удалит все файлы в конце процесса? - Евгений С
@EugeneS: я проверил исходный код GNU tar, и между архивированием и удалением есть некоторая (настраиваемая) задержка, но tar не будет ждать, пока будет создан весь tarball. - Фред Фу
Как насчет бсдтар? Кто-нибудь? - РОП
Работает отлично. Помогает делать бэкапы pg_dump -Fd - Вячеслав Добромыслов
У меня была задача - заархивировать файлы и потом удалить в ОС установленный "tar" без GNU-опций.
Метод:
Предположим, у нас есть каталог с файлами.
Нужно переместить все файлы за неделю в tar и удалить.
Я делаю один архив (arc.tar) и добавляю в него файлы. (Вы можете создавать новый архив каждую попытку)
Решение:
ответ дан 17 апр.
Для не GNU tar вы можете использовать «-u» для обработки файла за файлом в цикле.
Я не уверен, что вы можете добавлять файлы в архивы bzip2 без предварительного извлечения. Однако вот одно решение, которое только что пришло мне в голову (давая вам псевдо-алгоритм):
Теперь у вас должен быть файл tar, содержащий все файлы по отдельности, файлы bzip2:ed. Вопрос в том, сколько накладных расходов добавляет bzip2 к отдельным файлам. Это необходимо проверить.
Может ли GNU tar добавить много файлов в архив, удаляя каждый из них по мере добавления?
Это полезно, когда на диске недостаточно места для хранения как всего tar-архива, так и исходных файлов, и поэтому нет возможности просто вручную удалить файлы после создания архива обычным способом.
задан 28 мая '12, 09:05
ВСЕ ли файлы, существующие в каталоге, должны быть сжаты? - Eugene S
не man tar ответьте на ваш вопрос? - lanzz
да, у меня есть каталог с именем images. Я делал tar cvjf images.tar.bz2 images/, но мне не хватило места на диске. - Ivy
Одно из решений может состоять в том, чтобы сделать ftp для целых файлов на другой машине --> заархивировать его --> затем вернуть «заархивированные файлы» на ту же машину - Pradeep
Я бы предпочел этого не делать, так как файлов много, и мне может понадобиться сделать это снова с еще большим количеством - Ivy
4 ответы
С GNU tar используйте вариант --remove-files .
ответ дан 21 дек '18, 03:12
Вы уверены, что использование этого флага удалит каждый файл после его добавления в архив, а не удалит все файлы в конце процесса? - Евгений С
@EugeneS: я проверил исходный код GNU tar, и между архивированием и удалением есть некоторая (настраиваемая) задержка, но tar не будет ждать, пока будет создан весь tarball. - Фред Фу
Как насчет бсдтар? Кто-нибудь? - РОП
Работает отлично. Помогает делать бэкапы pg_dump -Fd - Вячеслав Добромыслов
У меня была задача - заархивировать файлы и потом удалить в ОС установленный "tar" без GNU-опций.
Метод:
Предположим, у нас есть каталог с файлами.
Нужно переместить все файлы за неделю в tar и удалить.
Я делаю один архив (arc.tar) и добавляю в него файлы. (Вы можете создавать новый архив каждую попытку)
Решение:
ответ дан 17 апр.
Для не GNU tar вы можете использовать «-u» для обработки файла за файлом в цикле.
Я не уверен, что вы можете добавлять файлы в архивы bzip2 без предварительного извлечения. Однако вот одно решение, которое только что пришло мне в голову (давая вам псевдо-алгоритм):
Теперь у вас должен быть файл tar, содержащий все файлы по отдельности, файлы bzip2:ed. Вопрос в том, сколько накладных расходов добавляет bzip2 к отдельным файлам. Это необходимо проверить.
Читайте также: