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

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


Существует множество утилит для сжатия файлов, но в каждом дистрибутиве Linux вы обязательно найдете gzip. Если вы учитесь использовать только один инструмент сжатия, это должен быть gzip .

Алгоритмы и деревья

Инструмент сжатия данных gzip был написан в начале 1990-х годов и до сих пор присутствует в каждом дистрибутиве Linux. Существуют и другие инструменты сжатия, но независимо от того, на каком компьютере Linux вам нужно работать, вы найдете на нем gzip. Поэтому, если вы знаете, как использовать gzip, вам не нужно ничего устанавливать.

gzip — это реализация алгоритма DEFLATE, изобретенного и запатентованного Филом Кацем из PKZIP. Алгоритм DEFLATE улучшил более ранние алгоритмы сжатия, которые работали с вариациями темы. Сжимаемые данные сканируются, идентифицируются уникальные строки, которые добавляются в двоичное дерево.

Уникальным строкам назначается уникальный токен идентификатора на основании их положения в дереве. Маркеры используются для замены строк в данных, и, поскольку маркеры меньше, чем данные, которые они заменили, файл сжимается. Замена токенов на исходные строки повторно увеличивает данные до их несжатого состояния.

Алгоритм DEFLATE добавил особенность, заключающуюся в том, что наиболее часто встречающимся строкам выделялись наименьшие токены, а наименее часто встречающимся строкам выделялись более крупные. Алгоритм DEFLATE также включает в себя идеи двух более ранних методов сжатия: кодирования Хаффмана и сжатия LZ77.

На момент написания алгоритму DEFLATE уже почти три десятилетия. Три десятилетия назад стоимость хранения данных была высокой, а скорость передачи — низкой. Сжатие данных было жизненно важно.

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

Команда gzip

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

Сжатие файла

Чтобы сжать (или заархивировать) файл, все, что вам нужно сделать, это передать имя файла команде gzip. Мы проверим исходный размер файла, сожмем его, а затем проверим размер сжатого файла.

ls -lh calc-sheet.ods
gzip calc-sheet.ods
ls -lh cal-*

Исходный файл, электронная таблица с именем calc-sheet.ods, имеет размер 11 КБ, а сжатый файл, также известный как файл архива, — 9,3 КБ. Обратите внимание, что имя файла архива — это имя исходного файла с добавленным к нему «.gz».

Первое использование команды ls нацелено на конкретный файл, электронную таблицу. Второе использование ls ищет все файлы, начинающиеся с «calc-», но находит только сжатый файл. Это связано с тем, что по умолчанию gzip создает файл архива и удаляет исходный файл.

Это не проблема. Если вам нужен исходный файл, вы можете получить его из архивного файла. Но если вы предпочитаете сохранить исходный файл, вы можете использовать параметр -k (сохранить).

gzip -k calc-sheet.ods
ls -lh calc-sheet.*

На этот раз исходный файл ODS сохраняется.

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

Чтобы распаковать (или разархивировать) архивный файл GZ, используйте параметр -d (распаковать). Это позволит извлечь сжатый файл из архива и распаковать его так, чтобы он был неотличим от исходного файла.

ls calc-sheet.*
gzip -d calc-sheet.ods.gz
ls calc-sheet.*

На этот раз мы видим, что gzip удалил архивный файл после извлечения исходного файла. Чтобы сохранить файл архива, нам нужно снова использовать параметр -k (сохранить), а также параметр -d (распаковать).

ls calc-sheet.*
gzip -d calc-sheet.ods.gz
ls calc-sheet.*

На этот раз gzip не удаляет файл архива.

Распаковка и перезапись

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

gzip -d text-file.txt.gz

Если вы заранее знаете, что вас устраивает перезапись файла в каталоге файлом из архива, используйте параметр -f (force).

gzip -df text-file.txt.gz

Файл будет перезаписан, и вы автоматически вернетесь в командную строку.

Сжатие деревьев каталогов

Параметр -r (рекурсивный) заставляет gzip сжимать файлы во всем дереве каталогов. Но результат может быть не таким, как вы ожидаете.

Вот дерево каталогов, которое мы собираемся использовать в этом примере. Каждый каталог содержит текстовый файл.

tree level1

Давайте воспользуемся gzip для дерева каталогов и посмотрим, что произойдет.

gzip -r level1/
tree level1

В результате gzip создал архивный файл для каждого текстового файла в структуре каталогов. Он не создавал архив всего дерева каталогов. Фактически, gzip может поместить в архив только один файл.

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

tar -czvf level1.tar.gz level1

Параметры tar:

  • c: создать архив.
  • z: протолкните файлы через gzip.
  • v: подробный режим. Напечатайте в окне терминала, что делает tar.
  • f level1.tar.gz: имя файла, которое будет использоваться для файла архива.

Это архивирует структуру дерева каталогов и все файлы в дереве каталогов.

Получение информации об архивах

Параметр -l (список) предоставляет некоторую информацию о файле архива. Он показывает сжатый и несжатый размеры файла в архиве, степень сжатия и имя файла.

gzip -l leve1.tar.gz
gzip -l text-file.txt.gz

Вы можете проверить целостность файла архива с помощью опции -t (тест).

gzip -t level1.tar.gz

Если все хорошо, вы автоматически возвращаетесь в командную строку. Отсутствие новостей - хорошая новость.

Если архив поврежден или не является архивом, вам сообщат об этом.

gzip -t not-an-archive.gz

Скорость против сжатия

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

Если вы не укажете один из этих параметров, gzip использует -6.

gzip -1 calc-sheet.ods
ls -lh calc-sheet.ods.gz
gzip -9 calc-sheet.ods
ls -lh calc-sheet.ods.gz
gzip -6 calc-sheet.ods
ls -lh calc-sheet.ods.gz

С таким маленьким файлом мы не увидели существенной разницы в скорости выполнения, но была небольшая разница в сжатии.

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

Сжатый, без защиты

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