В наши дни мы сталкиваемся с файлами архивов очень часто и на всех платформах: 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. Мы рассмотрели только консольные команды, так сказать, чтобы была понятна суть. В графическом интерфейсе все еще проще. Если остались вопросы - задавайте их в комментариях.
На 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
Автор ты хоть опиши что да как в какой папке ты находишся что ты архивируешь и где этот архив должен появится