Поиск по сайту:

Как сжимать и распаковывать файлы с помощью tar в Linux


Tar — это больше, чем просто утилита для архивирования: tar поставляется с некоторыми замечательными встроенными функциями, которые позволяют сжимать и распаковывать файлы одновременно с их архивированием. Узнайте все об этом в этой статье и не только!

Что такое tar и как его установить?

Согласно руководству tar (доступ к которому можно получить, набрав man tar после его установки), tar — это утилита архивирования. Он поддерживает множество функций, в том числе сжатие и распаковку файлов на лету при их архивировании. Начнем с установки tar:

Чтобы установить tar в свой дистрибутив Linux на основе Debian/Apt (например, Ubuntu и Mint), выполните следующую команду в своем терминале:

sudo apt установить tar

Чтобы установить tar в ваш дистрибутив Linux на основе RedHat/Yum (например, RHEL, Centos и Fedora), выполните следующую команду в своем терминале:

sudo yum установить tar

Далее мы создадим некоторые образцы данных:

mkdir test; cd test
touch a b c d e f 
echo 1 > a; echo 5 > e; echo '22222222222222222222' > b

Здесь мы создали каталог test и создали в нем шесть пустых файлов с помощью команды touch. Мы также добавили некоторые номера в файлы a, e и b, хотя, в частности, файл b содержит повторяющиеся данные, который будет хорошо сжиматься.

Если вы хотите узнать больше о том, как работает сжатие, вы можете ознакомиться с нашей статьей Как работает сжатие файлов? статья.

Создание несжатого архива

tar -hcf all_files.tar *
ls -l | grep -v total | awk '{print $5"tbytes for: "$9}' | sort -n

Здесь мы создали несжатый архив с помощью команды tar -hcf all_files.tar *. Давайте посмотрим на параметры, используемые в этой команде.

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

Далее у нас есть параметры -c и -f. Обратите внимание, что они просто пишутся вместе с - в -h, то есть вместо того, чтобы указывать другой -, мы просто помечаем их на другом сокращении параметры. Быстро и просто.

Параметр -c означает создать новый архив. Обратите внимание, что по умолчанию каталоги архивируются рекурсивно, если также не используется параметр –no-recursion. Опция -f позволяет указать имя архива. Таким образом, он должен быть последним в нашей цепочке параметров (поскольку он требует параметра), поэтому мы можем добавить имя файла архива непосредственно за ним. Использование tar -fch test.tar * не будет работать:

После того, как tar сгенерирован, мы используем модифицированный вывод ls, который четко показывает нам количество байтов в файле. Как видите, файл tar намного больше, чем все наши файлы вместе взятые. Файлы просто архивируются, и добавляются некоторые общие накладные расходы для tar.

Интересно отметить, что мы также можем увидеть, с какими типами файлов мы работаем, просто используя команду file в командной строке:

file c
file b
file all_files.tar

Создание несжатого архива

Очень распространенным алгоритмом сжатия является GZIP. Давайте добавим тот же параметр (-z) в нашу цепочку сокращенных параметров командной строки и посмотрим, как это повлияет на размер файла:

tar -zhcf all_files.tar.gz [a-f]
ls -l | grep -v total | awk '{print $5"tbytes for: "$9}' | sort -n

На этот раз мы указали регулярное выражение для использования только файлов с именами от a до f, не позволяя команде tar включать all_files .tar внутри нового файла all_files.tar.gz!

Посмотрите, как вы на самом деле используете регулярное выражение? и Изменение текста с помощью регулярных выражений с помощью sed, если вы хотите узнать больше о регулярных выражениях.

Мы также включили параметр -z, который будет использовать сжатие GZIP для сжатия результирующего файла .tar после завершения выгрузки данных в него. Приятно видеть, что в итоге мы получаем файл размером 186 байт, что говорит нам о том, что в этом случае заголовок tar/служебные данные размером около 10 КБ могут быть очень хорошо сжаты.

Общий размер архива в 7,44 раза больше, чем общий размер файла, но это не имеет большого значения, так как этот вымышленный пример не представляет собой сжатие больших файлов, где почти всегда наблюдается выигрыш вместо потерь, если только данные не были предварительно сжаты или такого формата, что его нельзя легко сжать с помощью различных алгоритмов. Тем не менее, один алгоритм (например, GZIP) может быть лучше другого (например, BZIP2) и наоборот для разных наборов данных.

Получение большего количества байтов с помощью сжатия высокого уровня

Можем ли мы сделать файл еще меньше? Да. Мы можем установить параметр максимального сжатия GZIP, используя параметр -I для tar, что позволяет нам указать используемую программу сжатия (благодаря пользователю ideaman42 из stackoverflow):

tar -I 'gzip -9' -hcf all_files.tar.gz [a-f]
ls -l | grep -v total | awk '{print $5"tbytes for: "$9}' | sort -n

Здесь мы указали -I gzip -9 в качестве используемой программы сжатия и отказались от опции -z (поскольку теперь мы указываем конкретную пользовательскую программу для использования вместо используя встроенную конфигурацию tar GZIP). В результате мы на 12 байт меньше в результате лучшей (но в целом более медленной) попытки сжатия (на уровне -9) с помощью GZIP.

Вообще говоря, чем быстрее сжатие (меньшее количество попыток сжатия, т. е. -1), тем больше размер файла. И чем медленнее сжатие (более высокий уровень попыток сжатия, т. е. -9), тем меньше размер файла. Вы можете установить собственные предпочтения, изменив уровень сжатия от -1 (быстро) до -9 (медленно).

Другие программы сжатия

Есть два других распространенных алгоритма сжатия, которые можно изучить и протестировать (различные параметры алгоритма также дают разные результаты размера и могут иметь дополнительные параметры сжатия), и это bzip2, который можно использовать, указав Параметр -j на tar и XZ, которые можно использовать, указав параметр -J.

Кроме того, вы можете использовать команду -I, чтобы установить максимальные параметры сжатия для bzip2 (-9):

И -9e для xz:

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

Распаковка файла

Распаковать файл очень просто, каким бы ни был исходный метод его сжатия, и при условии, что такой алгоритм сжатия присутствует на вашем компьютере. Например, если первоначальным алгоритмом сжатия был bzip2 (обозначенный расширением .bz2 к имени файла tar), вам потребуется выполнить sudo apt install bzip2 (или sudo yum install bzip2) на целевом компьютере, который должен распаковать файл.

rm a b c d e f
tar -xf all_files.tar.gz
ls

Мы просто указываем -x, чтобы расширить или распаковать наш файл all_files.tar.gz, и указать имя файла, снова используя -f сокращенный вариант, как и раньше.

Сжатие файлов может помочь вам сэкономить много места на ваших устройствах хранения, а знание того, как использовать tar в сочетании с доступными параметрами сжатия, поможет вам в этом. Если архив необходимо снова распаковать, это легко сделать, если на компьютере, используемом для распаковки или извлечения данных из архива, имеется правильное программное обеспечение для декомпрессии. Наслаждайтесь!