Урок 11. Архивация (архивирование) и сжатие файлов

Работа с архивами 

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

Архивирование - объединение нескольких файлов в один файл. При этом финальный файл может иметь суммарный размер архивированных файлов либо даже больше. Это связано с добавлением служебной информации. 

Сжатие - уменьшение размера исходного файла. 

В Linux существует несколько программ, позволяющие выполнять вышеописанные операции.

 

Команда zip 

Распространена и в Windows. Если планируете использовать файлы и в Windows, то смело пользуйтесь данной программой.

Синтаксис команды таков: zip [опции] финальный_файл сжимаемый_файл

Попробуем сжать файл manual.pdf в домашнем каталоге:

Отображение файлов в папке

Сжатие файла командой zip
Сжатие файла командой zip

А степень сжатия всегда одинакова? 

Нет, для разных файлов она всегда разная. Но можно задавать уровни сжатия. Команда zip поддерживает 10 уровней сжатия от 0 до 9, где 0 не сжимает, а просто архивирует файл. Например, так zip -9 Archive.zip manual.pdf.

А какой уровень сжатия был, когда мы не указывали его? 

По умолчанию это всегда 6.

 

А можно сжать сразу несколько файлов? 

Да. Можно указать последовательно несколько файлов, например, так:

Сжатие нескольких файлов

Либо можно собрать все файлы в одном каталоге и указать в команде данный каталог. При этом необходимо воспользоваться опцией -r (--recursive), потому иначе будет сжата только пустая папка. 

Кстати, у данной команды есть возможность ввести пароль для защиты содержимого. Для этого существуют опции -P (--password) и -e (--encrypt)

Установка пароля для архива

Данная опция довольно небезопасная в плане сокрытия пароля, поэтому рекомендуется следующая опция: 

Активация шифрования для архива

 

А как распаковать сжатый файл? 

Для этого существует команда unzip. Распакуем наш файл Archive.zip:

Распаковка файла командой unzip

 

А можно как-нибудь узнать содержимое архива? Ведь не всегда же мне для этого надо его распаковывать. 

Конечно можно. Воспользуйся опцией -l (--list)

Отображение содержимого архива

Иногда бывает, что архив поврежден, поэтому советую всегда его проверять с помощью опции -t (--test):

Проверка архива на ошибки

 

Команды gzip, bzip2 

В Linux существуют и более мощные утилиты сжатия по сравнению с zip. Это gzip и bzip2. Обе утилиты очень похожи, но отличаются степенью сжатия. Работают они немного по-другому в отличие от zip

Формат команд следующий: 

gzip [опции] архивированный_файл 

bzip2 [опции] архивированный_файл 

Выполним команду gzip presentation.pdf:

Архивирование с помощью команды gzip

Как видно команда не выдает результат своей работы, кроме того она удалила исходный файл. Поэтому для слежения за ходом выполнения команды можно воспользоваться опцией -v (--verbose):

Функция verbose в gzip

А чтобы сохранить исходный файл воспользуйтесь опцией -k (--keep):

Сохранение оригинального файла после сжатия

 

А как можно сразу задать другое имя архивированного файла? 

Конечно можно. Для этого необходимо воспользоваться опцией -с (--stdout) и перенаправить выходной поток в новый файл:

Изменение имени сжатого файла

Как видно из рисунка исходный файл presentation.pdf остался нетронутым и не нужно пользоваться опцией -k (--keep).

 

 А если не указать перенаправление потока в другой файл, что будет? 

Тогда результат команды не будет сохранен и отобразится на экране терминала:

Результат сжатия не был сохранен в файле

Кстати, у данной команды также доступны различные степени сжатия от 0 до 9, как и в у zip.

 

А можно сжать сразу несколько файлов за один прием? 

Да, можно указать последовательно несколько файлов либо поместить их в каталог и вызвать команду gzip -r либо gzip  --recursive:

Сжатие нескольких файлов посредством gzip

Команда рекурсивно создаст архив каждого файла.

 

А можно создать один общий архив всех файлов? 

Можно, но об этом немного позже. 

Распаковка архива возможна 3-мя способами: 

gunzip MyDocument.pdf.gz 

либо 

gzip -d MyDocument.pdf.gz 

либо 

gzip --decompress MyDocument.pdf.gz

 

При распаковке удаляется исходный архив, поэтому, если нужно его сохранить, то воспользуйся опцией -k (--keep).  

Все вышеописанные опции и приемы доступны и для команды bzip2.  Для распаковки архива существует команда bunzip2.  

Для команд gunzip и bunzip2 доступны следующие опции: 

-t (--test) - проверка архива на ошибки

-l (--list) - отображение списка файлов в архиве без распаковки самого архива

Команда tar 

Синтаксис команды:  tar [опции] целевой_файл исходный файл. 

Данная команда служит только для архивирования одного или нескольких файлов. При создании архива исходный файл не удаляется. 

Для создания архива необходимо использовать опции -c (--create) и -f (--file)

Запомните! При создании архива всегда помещайте опцию -f в конец. Недопустимо, чтобы она была в начале или середине списка опций. То есть запись tar -fc неверная!

 

А можно архивировать и целые каталоги? 

Да, достаточно в качестве исходного файла указать каталог.

 

А как узнать список файлов в архиве без распаковки всего файла? 

Для этого существует опция -t (--list), использовать ее надо совместно с опцией -f (--file). Ну а если хотите распаковать архив, то воспользуйтесь опцией -x (--extract)

Теперь, когда мы умеем создавать архивы, мы можем воспользоваться командами gzip либо bzip2 для сжатия архивированного файла. Как вы помните, данные команды не могут создавать единый архив из нескольких файлов, поэтому на помощь им приходит команда tar.  

Можно, конечно, воспользоваться символами групповых операций:  

tar -cf  Mymusic.tar music/; gzip -k Mymusic.tar 

или 

tar -cf Mymusic.tar music/ | gzip -c > Mymusic.tar.gz.

Но существует запись получше. Вместо символов групповых операций достаточно воспользоваться специальными опциями. Чтобы сжать с помощью gzip примените опцию -z (--gzip) либо -j (--bzip2) для bzip2.

Например, так: 

tar -zcf Mymusic.tar.gz music/ 

или

tar -jcf Mymusic.tar.bz2 music/. 

Кстати, команда tar по умолчанию не отображает в терминале все свои действия, поэтому можете воспользоваться опцией -v (--verbose).

Ну а для того, чтобы разархивировать файл достаточно заменить опцию -c опцией -x (--extract)

tar -zxf Mymusic.tar.gz 

или 

tar -jxf Mymusic.tar.bz2.

А можно и здесь узнать список файлов, не распаковывая сам архив tar.gz или tar.bz2? 

Да, достаточно к вышеуказанной команде добавить опцию -t (--list).

Вот мы и рассмотрели часто используемые команды и опции для уверенной работы в Linux. В последующих уроках мы рассмотрим и другие команды.