В наши дни мы сталкиваемся с файлами архивов очень часто и на всех платформах: Windows, Mac или Linux. Это могут быть программы, резервные копии систем или баз данных или просто архив файлов. Нам также часто приходится создавать свои архивы в Linux, чтобы передать несколько файлов друзьям или загрузить на файлообменник. В виде архивов распространяются пакеты программ, исходные коды, а также много других файлов, распространяемых на просторах интернета. Научиться выполнять архивирование файлов в Linux через терминал очень важно, возможно это вам понадобиться, когда не будет доступа к графическому интерфейсу, или просто со временем в терминале станет более приятно работать.
В этой инструкции я хочу подробно рассмотреть утилиты для архивирования в Linux, мы рассмотрим не только самую популярную и универсальную утилиту - tar, но и другие менее известные, а также популярные алгоритмы сжатия.
Содержание статьи
Архивирование в Linux
Важно отметить, что архивирование в Linux это не одно и то же что и сжатие файлов Linux. Архивирование - это объединение нескольких небольших файлов в один, с целью более удобной последующей передачи, хранения, шифрования или сжатия. Как я уже сказал, архивация выполняется специальными утилитами. Мы не будем трогать архивацию файлов в графическом интерфейсе, вы с ними разберетесь сами, наша тема - терминал.
Самой популярной для Linux утилитой для архивации есть tar. Она используется почти везде, для архивации исходников, упаковки пакетов. Для сжатия используются другие утилиты, в зависимости от алгоритма сжатия, например, zip, bz, xz, lzma и т д. Сначала выполняется архивация, затем сжатие, отдельными программами. Автоматический запуск некоторых утилит сжатия для только что созданного архива поддерживается в tar и других подобных программах с помощью специальных опций.
Также полезной возможностью архивации есть шифрование. Но теперь давайте рассмотрим какие существуют утилиты, с помощью которых выполняется архивирование файлов linux и как ими пользоваться.
Tar
Tar - это стандартная утилита, с помощью которой выполняется архивирование файлов Linux. Постепенно из небольшой программы архивации она превратилась в мощный инструмент, поддерживающий работу со многими вариантами архивов и алгоритмами сжатия. Программа поддерживает большое количество параметров. Давайте рассмотрим ее синтаксис и основные параметры:
$ tar опцииf файл_для_записи /папка_файлами_для_архива
А теперь разберем основные опции:
- A - добавить файл к архиву
- c - создать архив в linux
- d - сравнить файлы архива и распакованные файлы в файловой системе
- j - сжать архив с помощью Bzip
- z - сжать архив с помощью Gzip
- r - добавить файлы в конец архива
- t - показать содержимое архива
- u - обновить архив относительно файловой системы
- x - извлечь файлы из архива
- v - показать подробную информацию о процессе работы
- f - файл для записи архива
- -C - распаковать в указанную папку
- --strip-components - отбросить n вложенных папок
Теперь давайте рассмотрим архивирование файлов в Linux. Чтобы создать архив используйте такую команду:
tar -cvf archive.tar /path/to/files
А чтобы распаковать архив tar linux:
tar -xvf archive.tar.gz
Очень просто запомнить для упаковки используется опция c - Create, а для распаковки - x - eXtract.
Сжатый архив создается точно так же, только с опцией -z, это в случае, если использовалось шифрование gizp, если нужно bzip то применяется опция -j:
tar -zcvf archive.tar.gz /path/to/files
tar -zxvf archive.tar.gz
Например, рассмотрим как заархивировать папку в Linux:
tar -zcvf home.tar.gz ~/
Хотя можно поступить по-другому, тот же архив мы получим если сначала создать обычный архив с помощью tar, а потом сжать его утилитой для сжатия, только здесь мы получаем больше контроля над процессом сжатия:
gzip archive.tar
Также можно убрать сжатие:
Утилиты сжатия мы рассмотрим ниже.
Чтобы добавить файл в архив используйте:
tar -rvf archive.tar file.txt
Для извлечения одного файла синтаксис тот же:
tar -xvf archive.tar file.txt
Можно извлечь несколько файлов по шаблону соответствия с помощью параметра wildcard, например, извлечем все php файлы:
tar -xvf archive.tar --wildcards '*.php'
По умолчанию распаковать архив tar linux можно в текущую папку с именем архива, чтобы распаковать в нужную папку используйте ключ -C:
tar -xvf archive.tar -C /path/to/dir
Стандартную утилиту рассмотрели, теперь кратко рассмотрим ее альтернативы. Их не так много, и большинство из них уже устаревшие.
Shar
Shar позволяет создавать самораспаковывающиеся архивы. По сути, это скрипт оболочки, и для распаковки ему необходима оболочка Bash или другая совместимая с Bourne Shell. У Shar есть несколько преимуществ, но также он потенциально небезопасный, так как архив представляет собой исполняемый файл.
Опции shar:
- -o - сохранять архив в файл вместо стандартного вывода
- -l - ограничить размер выходного файла
- -L - ограничить размер выходного файла и разбить его на части
- -n - имя архива не будет включено в заголовок
- -a - разрешить автоматическую генерацию заголовков
Примеры использования shar для того чтобы заархивировать папку linux:
Создаем shar архив:
shar file_name.extension > filename.shar
Распаковываем shar архив:
./filename.shar
Ar
ar - утилита для создания и управления архивами. В основном используется для архивации статических библиотек, но может быть использована для создания любых архивов. Раньше использовалась довольно часто но была вытеснена утилитой tar. Сейчас используется только для создания и обновления файлов статических библиотек.
Опции Ar:
- - d - удалить модули из архива
- - m - перемещение членов в архиве
- - p - напечатать специфические члены архива
- - q - быстрое добавление
- - r - добавить члена к архиву
- - s - создать индекс архива
- - a - добавить новый файл к существующему архиву
Теперь рассмотрим примеры использования. Создадим статическую библиотеку libmath.a из объектных файлов substraction.o и division.o:
ar cr libmath.a substraction.o division.o
Теперь извлечем файлы из архива:
ar x libmath.a
Таким образом, можно распаковать любую статическую библиотеку.
Cpio
cpio - означает Copy in and out (скопировать ввод и вывод). Это еще один стандартный архиватор для Linux. Активно используется в менеджере пакетов Red Hat, а также для создания initramfs. Архивация в Linux для обычных файлов с помощью этой программы не применяется.
Опции утилиты:
- -a - сбросить время обращения к файлам после их копирования
- -A - добавить файл
- -d - создать каталоги при необходимости
Пример использования. Создаем cpio архив:
ls
ls | cpio -ov > /path/to/output_folder/obj.cpio
Распаковываем архив:
cpio -idv < /path/to folder/obj.cpio
Архивирование папки linux выполняется также само.
Сжатие архивов в Linux
Как создать архив в linux рассмотрели. Теперь давайте поговорим о сжатии. Как я говорил, для сжатия используются специальные утилиты. Рассмотрим кратко несколько из них
Gzip
Чаще всего применяется Gzip. Это стандартная утилита сжатия в Unix/Linux. Для декомпрессии используется gunzip или gzip -d Сначала рассмотрим ее синтаксис:
$ gzip опции файл
$ gunzip опции файл
Теперь разберем опции:
- -c - выводить архив в стандартный вывод
- -d - распаковать
- -f - принудительно распаковывать или сжимать
- -l - показать информацию об архиве
- -r - рекурсивно перебирать каталоги
- -0 - минимальный уровень сжатия
- -9 - максимальный уровень сжатия
Примеры использования вы уже видели в описании утилиты tar. Например, выполним сжатие файла:
gzip -c файл > архив.gz
А теперь распакуем:
Но чтобы сжать папку в Linux вам придется сначала заархивировать ее с помощью tar, а уже потом сжать файл архива с помощью gzip.
Bzip
bzip2 - еще одна альтернативная утилита сжатия для Linux. Она более эффективная чем gzip, но работает медленнее. Для распаковки используйте утилиту bunzip2.
Описывать опции bzip2 я не буду, они аналогичны gzip. Чтобы создать архив в Linux используйте:
bzip2 file
В текущем каталоге будет создан файл file.bz2
Lzma
Новый и высокоэффективный алгоритм сжатия. Синтаксис и опции тоже похожи на Gzip. Для распаковки используйте unlzma.
Xz
Еще один высокоэффективный алгоритм сжатия. Обратно совместимый с Lzma. Параметры вызова тоже похожи на Gzip.
Zip
Кроссплатформенная утилита для создания сжатых архивов формата zip. Совместимая с Windows реализациями этого алгоритма. Zip архивы очень часто используются для обмена файлами в интернете. С помощью этой утилиты можно сжимать как файлы, так и сжать папку linux.
Синтаксис утилиты:
$ zip опции файлы
$ unzip опции архив
Опции утилиты:
- -d удалить файл из архива
- -r - рекурсивно обходить каталоги
- -0 - только архивировать, без сжатия
- -9 - наилучший степень сжатия
- -F - исправить zip файл
- -e - шифровать файлы
Чтобы создать Zip архив в Linux используйте:
zip -r /path/to/files/*
А для распаковки:
unzip archive.zip
Как видите архивирование zip в Linux не сильно отличается от других форматов.
Выводы
Теперь вы знаете все что нужно об архивации файлов в Linux. Мы рассмотрели только консольные команды, так сказать, чтобы была понятна суть. В графическом интерфейсе все еще проще. Если остались вопросы - задавайте их в комментариях.
Anubis – это максимально легкое open-source решение, созданное специально для защиты небольших веб-ресурсов от бесконечного потока запросов от ботов и AI парсеров. Этот инструмент можно считать "ядерным вариантом", потому что он заставляет ботов выполнять вычисления похожие на майнинг криптовалюты. Но это неплохая альтернатива для тех, кто не может или не хочет использовать Cloudflare. Посмотреть детали





На Linux перешел недавно и во многом пока чуток туплю(
Спасибо автору за отличный пост выше!
Если можно, кто нибудь посоветуйте оболочку для архиваторов аля винрар или чтонить в этом роде, но для Linux.
Через терминал поставил p7zip-full и p7zip-rar, но все архивы создаются дефолтами и не могу задать ни степень сжатия ни сменить некоторые опции для упаковки 🙁
Peazip, ark, file-roller
Ребята подскажите как распаковать зип архив в папку /var/www/example.com ? просто так в ту директорию ничего не перетащить и собственно конечную папку пришлось через терминал создавать с чем я справился но вот с распаковкой туда архива prestashop_1_6_1_5.zip у меня ничего не выходит
выше из ситуации следующим способом: Распаковал архив в удобном месте и применил команду sudo cp -rp /откуда/скопировать/* /куда/скопировать
Звёздочка означает что нужно скопировать всё содержимое директории.
Можно запустить файловый менеджер с правами root (kdesu/gksu) тогда сможете работать с любой папкой.
zip -r /path/to/files/*
команда не правильная, правильно писать так
zip -r archive.zip /path/to/files/*
ну молодец, все работает теперь.
Как сделать с помощью ZIP архивацию файла в конкретную директорию?
Например мне нужно за архивировать файл что находится /opt/1.sh и что бы он за архивировался в папку /home/
про pax не забывайте, тоже довольно интересный архиватор
>Чтобы создать архив используйте такую команду:
>tar -cvf archive.tar.gz /path/to/files
Почему расширение tar.gz, должно быть по идее .tar?
>Сжатый архив создается точно так же, только с опцией -z, это в случае, если использовалось шифрование gizp, если нужно bzip то применяется опция -j:
опечатка в слове gizp. Должно быть gzip
Как делать поиск по тексту в зипах?
У меня несколько тысяч зазипованных книг, распаковывать все нереально.
Через команду вывода -t.
Например следующая команда покажет только файлы с расширением png:
tar -tf archive.tar *.png
У Вас написано про опции zip/unzip
-d удалить файл из архива
проверяем:
unzip -h
-d extract files into exdir по-моему это совсем не удаление
PS у меня Ubuntu
Вдогонку
zip -h
-d delete entries in zipfile
Получается, что вы тоже правы, но тем не менее желательно уточнить к какой команде (zip/unzip) относится приведенная в статье опция - d
Уточнение
zip -h
-d delete entries in zipfile
unzip -h
-d extract files into exdir
По-моему опции нужно расписать отдельно для каждой команды
дд, linux-redhat
есть папка с архивами (7z и Zip), необходимо написать баш файл в котором циклом пройтись по всем архивам и вытащить список содержимого архива в отдельный файл,
например есть /tmp/arc1.7z в котором 3 файла 1.txt, 2.txt, 3.txt.
нужен конечный файл arc1.txt в котором список этих файлов..
этот код не работает, что не так делаю?
getlist1="7za l"
getlist2=">"
input=${1}
output=${2}
glist() {
echo "Get list:"
for file in ${input}*.7z; do
filelist=${output}`basename ${file}`.txt
${getlist1} ${file} ${getlist2} ${filelist}
echo "File saved:" ${filelist}
done
}
glist
Спасибо за подробную статью.
Хотел бы попросить добавить в раздел об утилите Zip, что нужно прописать сначала имя файла, который будет у нас в качестве созданного архива, а уже потом какие файлы мы хотим заархивировать.
что делает эта команда? cd folder 2>/dev/null && pwd || pwd
cd folder: попытка переместиться в каталог с названием folder
2>/dev/null: 2> - это вывод ошибок в указанное место. В данном случае в /dev/null или по другому "пустое устройство" и ошибки просто уничтожаются.
&& сразу после выполнения вывести путь до текущей директории.
|| pwd если выше написанное не сработало, то просто выводится путь до текущей директории.
tar -cvf archive.tar /path/to/files
Автор ты хоть опиши что да как в какой папке ты находишся что ты архивируешь и где этот архив должен появится