Странно, что никто другой не упомянул, что современные версии GNU tar
позволяют сжимать при связывании:
tar -czf output.tar.gz directory1 ...
tar -cjf output.tar.bz2 directory2 ...
Вы также можете использовать компрессор по вашему выбору при условии, что он поддерживает параметры ' -c
' (в стандартный вывод или из стандартного ввода) и ' -d
' (распаковать):
tar -cf output.tar.xxx --use-compress-program=xxx directory1 ...
Это позволит вам указать любой альтернативный компрессор.
[ Добавлено : если вы распаковываете из gzip
или bzip2
сжатые файлы, GNU tar
автоматически обнаруживает их и запускает соответствующую программу. То есть можно использовать:
tar -xf output.tar.gz
tar -xf output.tgz # A synonym for the .tar.gz extension
tar -xf output.tar.bz2
и они будут обработаны должным образом. Если вы используете нестандартный компрессор, вам необходимо указать это при извлечении.]
Причина разделения, как и в выбранном ответе, разделение обязанностей. Среди прочего, это означает, что люди могут использовать cpio
программу для упаковки файлов (вместо tar
), а затем использовать выбранный компрессор (когда-то предпочтительным был компрессор pack
, позже он был compress
(который был намного эффективнее, чем pack
), а затем gzip
он обошел обоих своих предшественников и полностью конкурирует с ним zip
(который был портирован на Unix, но не является родным), и теперь bzip2
, по моему опыту, обычно имеет преимущество на 10-20% gzip
.
[ Добавлено : кто-то отметил в своем ответе cpio
забавные условности. Это правда, но до тех пор, пока GNU не tar
получит соответствующие параметры (' -T -
'), это cpio
была лучшая команда, когда вы не хотели архивировать все, что находится в данном каталоге - вы действительно могли выбрать, какие именно файлы были заархивированы. Обратной стороной cpio
было то, что вы не только могли выбирать файлы - их нужно было выбирать. Есть еще одно место, где cpio
забивают; он может выполнять копирование на месте из одной иерархии каталогов в другую без какого-либо промежуточного хранилища:
cd /old/location; find . -depth -print | cpio -pvdumB /new/place
Между прочим, в этом контексте важна -depth
опция ' ' find
- она копирует содержимое каталогов перед установкой разрешений для самих каталогов. Когда я проверил команду перед добавлением к этому ответу, я скопировал некоторые каталоги только для чтения (разрешение 555); когда я пошел, чтобы удалить копию, мне пришлось ослабить разрешения для каталогов, прежде чем ' rm -fr /new/place
' смог закончить. Без -depth
опции cpio
команда не удалась бы. Я вспомнил об этом только тогда, когда пошел делать очистку - цитируемая формула для меня автоматическая (в основном в силу многих повторений на протяжении многих лет). ]