Модуль 14. Архивирование и сжатие информации

Введение

Из этого модуля вы узнаете о еще одном принципиальном отличии Linux и Windows, только теперь в части работы с архивами. Тема несложная, но крайне прикладная. Приступим!

Архивация Linux vs Windows

Архивирование и сжатие файлов — это крайне любопытная тема, по которой сразу виден большой контраст между мирами Windows и Linux.

В системе Windows, как вы знаете, большую популярность приобрели Zip-архивы, поэтому Microsoft даже реализовала их поддержку на уровне системы под названием «сжатых папок». Данный формат включает одновременно и архивирование, и сжатие, в связи с чем эти слова в мире Windows произносят вместе и скороговоркой «архивированиеисжатиефайлов»…, как будто в баню дровишки принес и высыпал.

В то же время в системе Linux граница между этими технологиями проведена настолько четко, что они реализованы в разных форматах и для работы с ними требуются разные приложения! Поэтому давайте уточним эти понятия:

  • Архивирование — это процесс объединения нескольких файлов в один пакет, называемый архивом, для его дальнейшего хранения в безопасном месте и последующего восстановления с сохранением всей необходимой метаинформации об исходных файлах: дате создания и последнего изменения, владельцах, правах доступа и т.д.

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

    Для архивирования используют утилиты tar, dd, cpio. Обратное действие по извлечению исходных файлов из архива называют распаковкой, разархивированием или восстановлением данных из архива.

    Архивирование само по себе не включает сжатие данных, но используется вместе с ним.

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

    Для сжатия файлов в Linux используют утилиты gzip, bzip2, xz и др. Обратное действие по извлечению исходных данных из сжатых файлов называют декомпрессией, восстановлением данных из сжатого файла.

Вот и получается, что когда нам нужно из Windows отправить несколько документов одним файлом, то это вопрос создания простого zip-архивчика. А стоит нам подключиться к веб-серверу по SSH, как отправка нескольких журналов в техподдержку превращается в двухэтапный процесс, сопряженный с фундаментальными идеями архивирования и сжатия информации.

Однако это не означает, что в Linux работа с архивами доступна только для продвинутых администраторов и не может быть столь же простой, как в Windows. Давайте начнем с возможностей графического интерфейса и уже после перейдем к обзору утилит.

Работа с архивами из графического интерфейса Fly

Архивы довольно часто используются в повседневной работе, поэтому всем пользователям нужно обладать хотя бы базовыми навыками по работе с ними. Файловый менеджер операционной системы Astra Linux позволяет делать это столь же просто, как мы к этому привыкли в Windows.

Для создания архива достаточно выделить в окне нужные объекты, кликнуть правой кнопкой мыши и в контекстном меню выбрать команду Упаковать ‣ Упаковать в архив…, см. рис. 59.

../_images/alse_mod14_archive_creation.png

рис. 59 Меню Упаковать: Упаковать в архив

Вам будет доступен большой перечень алгоритмов сжатия: 7-zip, jar, bzip, gzip и др., см. рис. 60.

../_images/alse_mod14_compression_method_selection.png

рис. 60 Выбор способа сжатия

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

Для просмотра и извлечения информации из архива вы можете легко «зайти в него», как в обычную папку, но этот способ не отличается высокой производительностью, поэтому подходит только в тех случаях, когда вам нужно извлечь всего пару файлов или просто ознакомиться с содержанием архива. Если же вы попробуете таким способом распаковать архив Apache Directory Studio, то вам потребуются минуты, на протяжении которых приложение будет пугать вас своей оценкой в несколько часов.

Поэтому для быстрого извлечения всех файлов из архива вам нужно кликнуть по нему правой кнопкой мыши и выбрать в контекстном меню действие Распаковать ‣ Распаковать в эту папку. В этом случае задача будет решена даже быстрее, чем вы успеете прочитать скороговорку «архиватор архивировал самораспаковывающийся архив, да так и не заархивировал».

Примечание

О самораспаковывающихся архивах.

Некоторые архиваторы позволяют создавать так называемые самораспаковывающиеся архивы (от англ. self-extracting archive, SFX), которые представляют собой исполняемые файлы, способные извлекать заложенную в них информацию без дополнительных приложений. В Windows такие архивы стали довольно популярны, а в Linux их саботируют, в том числе и по соображениям безопасности.

Однако в техническом плане для создания SFX-архивов в Linux есть все необходимые инструменты, и, чтобы поместить папку myfolder в исполняемый файл myarchive.7z.sfx, достаточно выполнить команду 7za a -sfx7zCon.sfx myarchive.7z.sfx myfolder. Но мы бы не рекомендовали отправлять такой файл Linux-администратору и объяснять, что с ним нужно сделать, если вы не хотите услышать, куда вам нужно пойти.

В завершение стоит отметить, что функции архивации в файловом менеджере Fly реализованы с помощью приложения Ark, поэтому пакет этого архиватора должен быть установлен в системе, иначе соответствующие пункты контекстного меню окажутся недоступны. Если же вы захотите работать с приложением Ark напрямую, то запустите его через Пуск ‣ Утилиты ‣ Работа с архивами Ark.

Работа с архивами из командной строки

Архивирование и распаковка утилитой tar

В давние времена резервные копии хранились исключительно на магнитных лентах, поэтому для повышения скорости чтения, записи и поиска информации на этих типах носителей в конце 70-х годов была разработана первая версия программы tar, название которой стало сокращением от слов tape archiver (с англ. ленточный архиватор).

Архивы tar, или как их еще называют тарболы (от англ. tar ball, где ball переводится как «сворачивать в клубок»), позволяют хранить всю необходимую метаинформацию о дате создания файлов, дате последнего изменения, владельцах, правах доступа и т.д., а программа tar умеет их правильно восстанавливать с учетом жестких и мягких ссылок. Именно поэтому администраторы Linux называют tar очень мощным инструментом для работы с архивами, а Windows-админы недоумевают, что в этом инструменте такого мощного, если сам по себе tar-формат даже сжатия данных не предполагает.

Примечание

В Linux кроме утилиты tar довольно часто используют еще dd и cpio. Утилита cpio (от англ. copy input/output — копировать входной/выходной поток) является предшественницей tar, но до сих пор еще часто используется несмотря на то, что tar покрывает все ее функциональные возможности. Утилита dd позволяет копировать блочное устройство в файл и обратно (от англ. disk dump — снимок диска).

Синтаксис утилиты tar следующий:

tar опции файл_архива [список_файлов_для_архивации] [-C каталог_для_распаковки]

Основные параметры и опции:

  • Параметр файл_архива – задает имя файла архива. Параметр является обязательным и должен следовать сразу же после ключа -f (--file).

Примечание

Мы уже знаем, что расширения файлов не играют в Linux большого значения, но скрипты автоматического дополнения команд по нажатию клавиши Tab (из соображений повышения производительности) не анализируют сигнатуру файлов и опираются только на расширения файлов.

Поэтому, если вы хотите, чтобы при использовании tar у вас работало автодополнение имен файлов, не забывайте добавлять к именам тарболов суффикс .tar. А если (вернее, когда) вы станете счастливым обладателем архива, по имени которого ни джобса не понять, чем он был создан, воспользуйтесь утилитой file <имя_архива>.

  • Ключ -f (--file) – позволяет задать имя архива, в который нужно упаковать указанные файлы или из которого их нужно извлечь. Опция является обязательной.

Примечание

Короткий ключ -f должен быть последним в группе опций, так как все последующие за ним символы будут восприняты как имя файла. Мы уже наблюдали такое поведение POSIX-ключей на примере команды ps -aux, которая работает правильно, но является некорректной, так как буква «x» после ключа -u в этом случае трактуется как имя пользователя.

  • Ключ -c (--create) – создать новый архив и поместить в него указанные файлы.

  • Ключ -x (--extract, --get) – извлечь файлы из архива. По умолчанию файлы извлекаются в ту же папку, где находится архив.

  • Ключ -t (--list) – показать содержимое архива.

Примечание

Утилита tar с ключом -t позволяет просматривать содержимое как обычных, так и сжатых тарболов, поэтому вы без проблем сможете посмотреть содержимое архива с помощью команды tar -tf myarchive.tar.gz.

  • Ключ -v (--verbose) – показывает подробную информацию о процессе работы.

  • Параметр список_файлов_для_архивации – имена файлов и папок, которые должны быть помещены в архив. Параметр нужно задать, если используется опция -c (--create). Элементы списка отделяются друг от друга символом пробела.

При извлечении файлов из архива часто указывают каталог:

  • Ключ -C (--directory) – позволяет задать каталог, в который нужно поместить извлекаемые из архива файлы.

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

    Параметр нужно задать, если используется опция -C (--directory).

Дополнительные опции, которые расширят ваши возможности по работе с архивами:

  • Ключ -r (--append) – добавить файлы в конец архива.

  • Ключ -A (--catenate, --concatenate) – добавить архив в конец другого архива.

  • Ключ --acls – сохранить/восстановить списки управления доступом.

  • Ключ --xattrs – сохранить/восстановить расширенные атрибуты файлов.

  • Ключ --exclude – исключить файлы по шаблону, в котором допустимо использовать символы подстановки в стиле glob.

  • Ключ --strip-components – извлечь файлы из вложенных папок архива, отбрасывая начало пути.

    Например, если у вас есть архив, созданный командой tar -cf varfiles.tar /var, то при извлечении файла var/log/auth.log в текущем каталоге будет создана папка var, в ней папка log, и только там вы найдете нужный вам файл.

    Если же вам нужна только игла без всех этих уток и зайцев, то можно отбросить два первых уровня и создать файл auth.log прямо в текущей директории командой:

    tar -xf varbak.tar --strip=2 var/log/auth.log

  • Ключ --wildcards – использовать символы подстановки для выбора определенных файлов, удовлетворяющих критерию.

  • Ключ -u (--update) – обновить архив более новыми файлами с тем же именем.

  • Ключ -h (--dereference) – следовать за символическими ссылками, т.е. архивировать файлы, на которые указывают символические ссылки. По умолчанию в архив добавляются именно ссылки, а не сами файлы.

Рассмотрим использование этих ключей на практических примерах.

Пример 1. Заархивируем файлы каталога в tar-архив.

Сначала нам нужно создать несколько тестовых файлов и каталогов, а чтобы посмотреть созданную нами структуру, мы воспользуемся утилитой tree. Если у вас её еще нет, поставьте ее командой sudo apt-get install tree.

localadmin@astra:~$ cd ~
localadmin@astra:~$ mkdir test_tar
localadmin@astra:~$ cd test_tar/
localadmin@astra:~/test_tar$ mkdir dir{1..3}
localadmin@astra:~/test_tar$ cat ~/.profile | tee dir{1..3}/file{1..2}
...
localadmin@astra:~/test_tar$ tree
.
├── dir1
│   ├── file1
│   └── file2
├── dir2
│   ├── file1
│   └── file2
└── dir3
    ├── file1
    └── file2

Заархивируем директорию dir1, используя ключ -c (--create). Для того чтобы увидеть список файлов, включенных в архив, воспользуемся ключом -v (--verbose). Обязательным параметром утилиты tar является ключ -f (--file), который задает имя файла архива. Дополнительным параметром идет список файлов для архивации. В нашем случае мы указали один каталог dir1.

localadmin@astra:~/test_tar$ tar -cvf archive.tar dir1
dir1/
dir1/file1
dir1/file2

localadmin@astra:~/test_tar$ ls -l
итого 24
-rw-r--r-- 1 localadmin localadmin 10240 авг  2 16:18 archive.tar
drwxr-xr-x 2 localadmin localadmin  4096 авг  2 16:16 dir1
drwxr-xr-x 2 localadmin localadmin  4096 авг  2 16:16 dir2
drwxr-xr-x 2 localadmin localadmin  4096 авг  2 16:16 dir3

localadmin@astra:~/test_tar$ tar -tf archive.tar
dir1/
dir1/file1
dir1/file2

Пример 2. Добавим каталог dir2 к тарболу archive.tar:

localadmin@astra:~/test_tar$ tar -rvf archive.tar dir2
dir2/
dir2/file1
dir2/file2

localadmin@astra:~/test_tar$ tar -tf archive.tar
dir1/
dir1/file1
dir1/file2
dir2/
dir2/file1
dir2/file2

Пример 3. Распакуем содержимое тарбола archive.tar в новый каталог extracted:

localadmin@astra:~/test_tar$ mkdir extracted3
localadmin@astra:~/test_tar$ cd extracted3/
localadmin@astra:~/test_tar/extracted3$ tar -xvf ../archive.tar
dir1/
dir1/file2
dir1/file1
dir2/
dir2/file2
dir2/file1
localadmin@astra:~/test_tar/extracted3$ tree
.
├── dir1
│   ├── file1
│   └── file2
└── dir2
   ├── file1
   └── file2
2 directories, 4 files

Пример 4. Распакуем содержимое сжатого архива archive_dir3.tar.gz в указанный каталог. Для выбора каталога необходимо использовать опцию -C, которая должна идти после имени архива:

localadmin@astra:~/test_tar/extracted3$ cd ..
localadmin@astra:~/test_tar$ mkdir extracted4
localadmin@astra:~/test_tar$ tar -xvf archive.tar -C ./extracted4/
localadmin@astra:~/test_tar$ tree ./extracted4/
./extracted4/
├── dir1
│   ├── file1
│   └── file2
└── dir2
   ├── file1
   └── file2

2 directories, 4 files

Пример 5. Извлечем из архива только папку dir1:

localadmin@astra:~/test_tar/extracted3$ cd ..
localadmin@astra:~/test_tar$ mkdir extracted5
localadmin@astra:~/test_tar$ cd extracted5
localadmin@astra:~/test_tar$ tar -xvf ../archive.tar dir1
localadmin@astra:~/test_tar/extracted5$ tree
.
└── dir1
    ├── file1
    └── file2

Пример 6. Извлечем из archive.tar только file1, используя опцию --wildcards:

localadmin@astra:~/test_tar/extracted3$ cd ..
localadmin@astra:~/test_tar$ mkdir extracted6
localadmin@astra:~/test_tar$ cd extracted6
localadmin@astra:~/test_tar$ tar -xvf ../archive.tar --wildcards '\*file1'
localadmin@astra:~/test_tar/extracted6$ tree
.
├── dir1
|    └── file1
└── dir2
  └── file1

2 directories, 2 files

Сжатие и восстановление данных утилитами gzip, bzip2, xz

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

Примечание

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

Однако ученым удалось разработать алгоритмы сжатия с потерями, такие как JPEG, MP3, AVI и др., которые учитывают особенности восприятия этих видов информации человеком и достигают выдающихся результатов без существенного снижения качества контента.

К сожалению, такие подходы не сработают с уже сжатыми данными, которые обладают избыточностью на уровне белого шума. Поэтому сжимать Zip-архив с помощью RAR будет не многим выгоднее, чем майнить криптовалюту Бузовой.

В мире Linux наибольшее распространение получили следующие форматы сжатых файлов:

  • Формат .gz (GNU Zip) использует алгоритм, который лучше всего подходит для сжатия текстовых данных. На текущий момент существует ряд алгоритмов, которые выигрывают и по скорости, и по степени сжатия, но тем не менее формат gz остается самым распространенным форматом для nix-подобных систем. Для работы с этим форматом предназначена утилита gzip.

  • Формат .bz2 использует алгоритм, который медленнее gz, но выдает ощутимо более высокие результаты по сжатию, см. рис. 61. Для работы с этим форматом предназначена утилита bzip2.

  • Формат .xz сжимает данные еще лучше, чем .bz2, но делает это еще медленнее. Для работы с этим форматом применяется утилита xz.

../_images/alse_mod14_compression_speed.png

рис. 61 Зависимость степени и скорости сжатия в современных алгоритмах

Утилиты gzip, bzip2 и xz реализуют разные алгоритмы сжатия, но их объединяет то, что все они обеспечивают сжатие только одного файла, поэтому для создания сжатых архивов, в которых содержится множество файлов, их нужно использовать совместно с утилитой tar.

Утилита gzip

Формат gz является самым распространенным, и утилита gzip по умолчанию включена во все дистрибутивы Linux, так же как поддержка сжатых папок в Windows. Синтаксис утилиты:

gzip <опции> <имя_файла>

Основные параметры и опции:

  • Параметр «имя_файла» – задает имя файла, для которого нужно выполнить сжатие или декомпрессию. Параметр является обязательным.

  • Без опций – вызов команды без ключей выполняет сжатие указанного файла.

  • Ключ -d (--decompress, --uncompress) – выполняет декомпрессию файла. Этот ключ использует Bash-скрипт gunzip.

  • Ключ -c (--stdout) – указывает, что результаты утилиты требуется перенаправить в стандартный поток вывода. При этом исходный файл не удаляется.

    С помощью этой опции вы можете сохранить сжатые данные в файл с любым именем или извлечь их с выводом на экран без сохранения на диске, как делает Bash-скрипт zcat. Чтобы узнать подробнее, см. приведенный ниже пример 5.

Дополнительные опции расширят ваши возможности по работе с архивами:

  • Ключ -# (--fast, --best) – управляет скоростью/коэффициентом сжатия, где -1 (или --fast) соответствует быстрому сжатию с наихудшим коэффициентом, и -9 (--best) соответствует медленному сжатию с наилучшим коэффициентом.

  • Ключ -t – позволяет выполнить проверку целостности сжатого файла.

  • Ключ -l (строчная L, --list) – показывает информацию о коэффициенте сжатия архива.

  • Ключ -f (--force) – выполняет сжатие или распаковку, даже если такой файл уже существует. Если ключ не задан и команда вызвана в интерактивном режиме, то утилита будет спрашивать, нужно ли перезаписывать существующий файл.

  • Ключ -k (--keep) – указывает, что исходный файл удалять не требуется. Данный параметр был добавлен позднее, поэтому его нет в man gzip, но вы можете найти информацию о нем в gzip --help.

  • Ключ -r – интерпретирует имя файла как имя каталога и делает по нему полный обход, выполняя сжатие или декомпрессию всех дочерних файлов.

Рассмотрим использование этих ключей на практических примерах.

Пример 1. Выполним сжатие файла archive.tar, который мы создали ранее, а затем выведем информацию о сжатом файле. Вы увидите, что исходный файл будет заменен сжатым файлом, в имени которого появится суффикс .gz. По умолчанию используется уровень сжатия 6, что обеспечивает хороший коэффициент сжатия при средней скорости.

localadmin@astra:~/test_tar$ gzip archive.tar
localadmin@astra:~/test_tar$ ls
archive_dir3.tar.bz archive_dir3.tar.xz dir1  dir3       extracted2
archive_dir3.tar.gz archive.tar.gz      dir2  extracted  extract
localadmin@astra:~/test_tar$ gzip -l archive.tar.gz
        compressed        uncompressed  ratio uncompressed_name
               624               10240  94.2% archive.tar

Пример 2. Выполним декомпрессию файла. Для этого воспользуемся ключом -d (--decompress):

localadmin@astra:~/test_tar$ gzip -d archive.tar
localadmin@astra:~/test_tar$ ls
archive_dir3.tar.bz   archive_dir3.tar.xz  dir1    dir3         extracted2
archive_dir3.tar.gz   archive.tar          dir2    extracted    extract

Тот же самый эффект можно получить с помощью Bash-скрипта gunzip, который под капотом вызывает gzip с ключом -d. Еще раз выполним сжатие и декомпрессию файла:

localadmin@astra:~/test_tar$ gzip archive.tar
localadmin@astra:~/test_tar$ gunzip archive.tar
localadmin@astra:~/test_tar$ ls
archive_dir3.tar.bz   archive_dir3.tar.xz  dir1    dir3       extracted2
archive_dir3.tar.gz   archive.tar          dir2    extracted  extract

Пример 3. Посмотрим разницу между стандартным, минимальным и максимальным уровнем сжатия, используя перенаправление на стандартный вывод с опцией :

localadmin@astra:~/test_tar$ gzip -c archive.tar > archive.tar.gz
localadmin@astra:~/test_tar$ gzip -c -1 archive.tar > archive_min.tar.gz
localadmin@astra:~/test_tar$ gzip -c -9 archive.tar > archive_max.tar.gz
localadmin@astra:~/test_tar$ ls -l
итого 48
-rw-r--r-- 1 localadmin localadmin   712 авг  2 16:28 archive_dir3.tar.bz
-rw-r--r-- 1 localadmin localadmin   572 авг  2 16:28 archive_dir3.tar.gz
-rw-r--r-- 1 localadmin localadmin   604 авг  2 16:28 archive_dir3.tar.xz
-rw-r--r-- 1 localadmin localadmin   610 авг  3 10:36 archive_max.tar.gz
-rw-r--r-- 1 localadmin localadmin   671 авг  3 10:36 archive_min.tar.gz
-rw-r--r-- 1 localadmin localadmin 10240 авг  2 16:34 archive.tar
-rw-r--r-- 1 localadmin localadmin   624 авг  3 10:32 archive.tar.gz

Пример 4. Проверим в работе опцию рекурсивного сжатия/декомпрессии файлов.

Создадим тестовый каталог и файлы:

localadmin@astra:~/test_compress$ cd ~
localadmin@astra:~$ mkdir -p test_compress/dir_level1/dir_level2 && cd test_compress/
localadmin@astra:~$ echo {00001..99999} > file
localadmin@astra:~$ echo level1_file1 > dir_level1/file1
localadmin@astra:~$ echo level1_file2 > dir_level1/file2
localadmin@astra:~$ echo level2_file1 > dir_level1/dir_level2/file1
localadmin@astra:~$ echo level2_file2 > dir_level1/dir_level2/file2
localadmin@astra:~/test_compress$ tree
.
├──  dir_level1
│    ├──  dir_level2
│    │   ├── file1
│    │   └── file2
│    ├── file1
│    └── file2
└── file

Выполним команду gzip с ключом -r и увидим, что у всех дочерних файлов появился суффикс .gz, который указывает на то, что они были сжаты.

localadmin@astra:~/test_compress$ gzip -r dir_level1
localadmin@astra:~/test_compress$ tree
 .
├──  dir_level1
│    ├──  dir_level2
│    │   ├──  file1.gz
│    │   └──  file2.gz
│    ├──  file1.gz
│    └──  file2.gz
└── file

Для декомпрессии дочерних файлов можно воспользоваться утилитой gzip с ключами -rd, но проще вызвать Bash-скрипт gunzip с одним ключом -r, так как скрипт под капотом вызовет утилиту gzip с ключом -d и добавит к списку опций ключ -r:

localadmin@astra:~/test_compress$ gunzip -r dir_level1
localadmin@astra:~/test_compress$ tree
.
├──  dir_level1
│    ├──  dir_level2
│    │   ├── file1
│    │   └── file2
│    ├── file1
│    └── file2
└── file

Пример 5. Выполним архивацию/декомпрессию данных с использованием потоков.

Сначала сожмем файл /var/log/auth.log с отправкой результатов в стандартный поток вывода, который далее перенаправим в файл auth-2024-05-27.gz:

localadmin@astra:~/test_compress$ sudo gzip --stdout /var/log/auth.log > auth-2024-05-27.gz
localadmin@astra:~/test_compress$ file auth-2024-05-27.gz
auth-2024-05-27.gz: gzip compressed data, last modified: Mon May 27 13:58:12 2024, from Unix,
original size 20249

Теперь выполним декомпрессию с отправкой результатов в стандартный поток вывода. В нашем случае мы выводим поток на экран, но его можно перенаправить на вход какой-нибудь утилиты, например, less или grep. Таким образом, параметры --stdout и --decompress работают как cat, только применительно к сжатым файлам.

localadmin@astra:~/test_compress$ gzip --stdout --decompress auth-2024-05-27.gz
...
May 27 12:50:11 astra sudo[1520]: pam_unix(sudo:session): session opened for user root by
localadmin(uid=0)
May 27 12:50:13 astra sudo[1520]: pam_unix(sudo:session): session closed for user root
...

Собственно, по этой причине и был создан вспомогательный Bash-скрипт zcat, который под капотом вызывает gzip с ключами -cd:

localadmin@astra:~/test_compress$ zcat auth-2024-05-27.gz
...
May 27 12:50:11 astra sudo[1520]: pam_unix(sudo:session): session opened for user root by
localadmin(uid=0)
May 27 12:50:13 astra sudo[1520]: pam_unix(sudo:session): session closed for user root
...

Утилиты bzip2 и xz

В Linux стараются не изобретать велосипеды, которых и без того хватает, поэтому все архиваторы, разработанные после утилиты gzip, заимствуют ее набор ключей, да и она сама старается не отставать и перенимает полезные новинки у «коллег». В соответствии с той же логикой разработчики альтернативных алгоритмов предлагают аналоги команд gunzip и zcat — для популярных типов архивов они называются bunzip2, bzcat, unxz и xzcat соответственно.

Учитывая вышесказанное, для изменения алгоритма сжатия в большинстве случаев достаточно поменять только название команды, и результат останется прежним. Если же что-то пойдет не по плану, то открывайте мануал и проверяйте синтаксис.

Пример 1. В качестве практики предлагаем выполнить сравнение технических характеристик алгоритмов сжатия. Начнем с подготовки файлов для демонстрации.

localadmin@astra:~/test_compress$ cp file file_bz
localadmin@astra:~/test_compress$ cp file file_gz
localadmin@astra:~/test_compress$ cp file file_xz
localadmin@astra:~/test_compress$ ls -l
итого 2364
drwxr-xr-x 3 localadmin localadmin   4096 авг  3 11:09  dir_level1
-rw-r--r-- 1 localadmin localadmin    140 авг  3 11:13  dir_level1_recourcive.gz
-rw-r--r-- 1 localadmin localadmin 599994 авг  3 11:26 file
-rw-r--r-- 1 localadmin localadmin 599994 авг  3 11:34 file_bz
-rw-r--r-- 1 localadmin localadmin 599994 авг  3 11:35 file_gz
-rw-r--r-- 1 localadmin localadmin 599994 авг  3 11:35 file_xz

Выполним сжатие файлов file_bz, file_gz и file_xz соответствующими утилитами, оценим время выполнения (используя утилиту time) и размер сжатых файлов ls -l. Как видите, утилита gzip оказалась быстрее xz примерно в 5 раз, но уровень сжатия утилиты xz в 30 раз выше.

localadmin@astra:~/test_compress$ time gzip file_gz
real    0m0,115s
user    0m0,094s
sys     0m0,016s

localadmin@astra:~/test_compress$ time bzip2 file_bz
real    0m0,127s
user    0m0,114s
sys     0m0,009s

localadmin@astra:~/test_compress$ time xz file_xz
real    0m0,600s
user    0m0,567s
sys     0m0,017s

localadmin@astra:~/test_compress$ ls -l
итого 896
drwxr-xr-x 3 localadmin localadmin   4096 авг  3 11:09 dir_level1
-rw-r--r-- 1 localadmin localadmin     36 авг  3 11:16 dir_levelevel1_file
-rw-r--r-- 1 localadmin localadmin    140 авг  3 11:13 dir_level1_recourcive.gz
-rw-r--r-- 1 localadmin localadmin 599994 авг  3 11:26 file
-rw-r--r-- 1 localadmin localadmin  80831 авг  3 11:34 file_bz.bz2
-rw-r--r-- 1 localadmin localadmin 212174 авг  3 11:35 file_gz.gz
-rw-r--r-- 1 localadmin localadmin   6824 авг  3 11:35 file_xz.xz

Архивирование и сжатие в стиле Windows утилитами zip и 7z

Мы уже знаем, что в Linux архивирование и сжатие файлов – это две разные процедуры, а в Windows популярность приобрели форматы, которые действуют по принципу «all inclusive».

С момента реализации «сжатых папок» в 2000 году фактическим стандартом для Windows стал формат Zip, но сообщество продолжало активно пользоваться в том числе форматами RAR и 7z, которые предлагали более продвинутые алгоритмы сжатия, что очень ценилось во времена дискеток на 1.5 МБ. Но все эти форматы объединяет одно — они поддерживают одновременно и архивирование, и сжатие, не прибегая к помощи сторонних инструментов.

При портировании Zip и 7z на Linux разработчики не стали менять логику работы утилит, поэтому они так и остались «двое из ларца» и не могут использоваться для сжатия тарболов. Вернее, положить tar-файл внутрь zip-архива можно без проблем, но для того чтобы заглянуть внутрь этого тарбола, вам потребуется сначала выполнить полную декомпрессию zip-архива.

И в завершение осталось только добавить, что подходы, закрепившиеся в Windows, действительно оказались намного удобнее, поэтому даже в утилиту tar встроили возможность создания сжатых архивов в одно действие:

  • Ключ -z (--gzip) – задействовать утилиту gzip для сжатия/декомпрессии данных.

  • Ключ -j (--bzip2) – задействовать утилиту bzip2 для сжатия/декомпрессии данных.

  • Ключ -J (--xz) – задействовать утилиту xz для сжатия/декомпрессии данных.

Примечание

Кстати, интересные факты…

  1. Название Zip не является аббревиатурой. Это просто английское слово, которое переводится как «двигаться с высокой скоростью». Разработчики хотели подчеркнуть, что их продукт был намного быстрее аналогов того времени.

  2. Название 7z является сокращением от 7-Zip, а еще ранее это приложение называлось 777, где 7 по заявлению автора – это просто цифра, которая была добавлена для того, чтобы приложение находилось выше других в сортированных списках. Но любители НЛО говорят, что это все неспроста, и цифра 7 подозрительно совпадает с телефонным кодом России, ведь создателем этого формата является российский программист Игорь Павлов.

  3. Название RAR является аббревиатурой и образовано от Roshal ARchiver. Создателем этого формата является еще один российский программист Евгений Рошал.

Мы не станем расписывать параметры вызова этих утилит, так как для zip в большинстве случаев будет достаточно команд zip/unzip, а для 7z — ключей a (append) и d (decompress) соответственно. Поэтому рассмотрим только несколько наиболее частых и полезных примеров.

Пример 1. Выполним архивирование и сжатие группы файлов с помощью утилиты zip:

localadmin@astra:~/test_compress$ zip file_archive.zip file_{gz,bz,xz}
 adding: file_gz (deflated 65%)
 adding: file_bz (deflated 65%)
 adding: file_xz (deflated 65%)
localadmin@astra:~/test_compress$ ls -l
итого 2988
drwxr-xr-x 3 localadmin localadmin   4096 авг  3  2023 dir_level1
-rw-r--r-- 1 localadmin localadmin    140 авг  3  2023 dir_level1_recourcive.gz
-rw-r--r-- 1 localadmin localadmin 599994 авг  3  2023 file
-rw-r--r-- 1 localadmin localadmin 636892 авг  3  2023 file_archive.zip
-rw-r--r-- 1 localadmin localadmin 599994 авг  3  2023 file_bz
-rw-r--r-- 1 localadmin localadmin 599994 авг  3  2023 file_gz
-rw-r--r-- 1 localadmin localadmin 599994 авг  3  2023 file_xz

Пример 2. Выполним восстановление файлов из архива. Для этого воспользуемся утилитой unzip:

localadmin@astra:~/test_compress$ unzip file_archive.zip
Archive:  file_archive.zip
replace file_gz? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
 inflating: file_gz
 inflating: file_bz
 inflating: file_xz
localadmin@astra:~/test_compress$ ls -l
итого 2984
drwxr-xr-x 3 localadmin localadmin   4096 авг  3  2023 dir_level1
-rw-r--r-- 1 localadmin localadmin    140 авг  3  2023 dir_level1_recourcive.gz
-rw-r--r-- 1 localadmin localadmin 599994 авг  3  2023 file
-rw-r--r-- 1 localadmin localadmin 636892 авг  3  2023 file_archive.zip
-rw-r--r-- 1 localadmin localadmin 599994 авг  3  2023 file_bz
-rw-r--r-- 1 localadmin localadmin 599994 авг  3  2023 file_gz
-rw-r--r-- 1 localadmin localadmin 599994 авг  3  2023 file_xz

Пример 3. Посмотрим содержимое архива с помощью ключа -l (строчная L, от слова list):

localadmin@astra:~/test_compress$ unzip -l file_archive.zip
Archive: file_archive.zip
Length Date Time Name
--------- ---------- ----- ----
599994 2023-08-03 11:35 file_gz
599994 2023-08-03 11:34 file_bz
599994 2023-08-03 11:35 file_xz
--------- -------
1799982 3 files

Пример 4. Выполним декомпрессию данных в стандартный поток вывода, т.е. на экран, с помощью ключа -p (pipe) команды unzip:

localadmin@astra:~$ sudo zip auth-2024-05-27.zip /var/log/auth.log
  adding: var/log/auth.log (deflated 16%)
localadmin@astra:~$ unzip -p auth-2024-05-27.zip
...
May 27 12:50:11 astra sudo[1520]: pam_unix(sudo:session): session opened for user root by
localadmin(uid=0)
May 27 12:50:13 astra sudo[1520]: pam_unix(sudo:session): session closed for user root
...

Пример 5. Выполним архивирование и сжатие с помощью утилиты tar в одно действие. Для этого воспользуемся ключом -z:

localadmin@astra:~$ sudo tar -czvf varfiles.tar.gz /var
...
/var/tmp/systemd-private-8cf669c8df1b48ba930a14a57441c918-upower.service-WFWd8H/
/var/tmp/systemd-private-8cf669c8df1b48ba930a14a57441c918-upower.service-WFWd8H/tmp/
/var/local/
/var/run
/var/mail/
localadmin@astra:~$

И тут же проведем обратную процедуру:

localadmin@astra:~$ tar -xzvf varfiles.tar.gz
...
/var/tmp/systemd-private-8cf669c8df1b48ba930a14a57441c918-upower.service-WFWd8H/
/var/tmp/systemd-private-8cf669c8df1b48ba930a14a57441c918-upower.service-WFWd8H/tmp/
/var/local/
/var/run
/var/mail/

localadmin@astra:~$ ls -l | grep var
drwxr-xr-x 12 localadmin localadmin 4096 мая 16 2023 var
-rw-r--r-- 1 root root 66761786 июн 4 06:44 varfiles.tar.gz

Практика и тестирование

Заключение

В этом модуле мы разобрались, как работать с архивированием и сжатием данных в Linux и почему для Windows-администраторов эти понятия являются синонимами. Граница между мирами, конечно, сильно истончается, поэтому мы уже видим, как zip и 7z портируют в Linux, а традиционно никсовые форматы наравне с rar и 7z включаются в нативную поддержку сжатых папок Windows (в том числе .tar, .tar.gz, .tar.bz2 и .tar.xz). Однако понимание концептуальных различий между форматами поможет вам уверенно использовать эти технологии в своей работе.

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

Дополнительные источники информации