15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
08.10.2024

Как извлечь файлы .tar.gz с помощью командной строки Linux

Файл .tar.gz — это сжатый архив, созданный путём объединения двух отдельных операций: tar (Tape Archive), который объединяет несколько файлов и каталогов в один архив, и gzip, который сжимает этот архив для уменьшения его размера. В результате получается портативный, компактный формат пакета, являющийся де-факто стандартом для распространения программного обеспечения, наборов конфигураций и системных резервных копий практически в каждой среде Linux и Unix-подобных систем.

Стандартная команда для извлечения архива .tar.gz — `tar -xzvf archive-name.tar.gz`. Понимание того, что делает каждый флаг и когда отклоняться от этого значения по умолчанию, отличает компетентного системного администратора от того, кто слепо копирует команды из интернета.

Понимание формата .tar.gz

Прежде чем выполнять какую-либо команду, полезно понять, с чем именно вы работаете. Формат `.tar.gz` (также записываемый как `.tgz`) представляет собой двухэтапный процесс:

  1. `tar` собирает файлы, сохраняет структуру каталогов, права доступа, владельца и символические ссылки в единый плоский файл.
  2. `gzip` сжимает этот плоский файл с использованием алгоритма DEFLATE, как правило достигая уменьшения размера на 60–70% для текстового содержимого.

Именно из-за этой двухэтапной архитектуры требуются оба флага: `-z` (gzip) и `-x` (извлечение). Ни один из инструментов в отдельности не справляется со всей задачей. В современных системах Linux `tar` достаточно умён, чтобы автоматически определять тип сжатия через `–auto-compress` или просто считывая магические байты файла, однако явное указание флагов всегда является более безопасной практикой в скриптах и конвейерах автоматизации.

Основной синтаксис и справочник по флагам

“`bash

tar -xzvf archive-name.tar.gz

“`

ФлагПолная формаФункция
—————–———-
`-x``–extract`Извлечь файлы из архива
`-z``–gzip`Пропустить архив через декомпрессию gzip
`-v``–verbose`Выводить имя каждого файла по мере его обработки
`-f``–file=ARCHIVE`Указать имя файла архива (должен непосредственно предшествовать имени файла)
`-C``–directory=DIR`Извлечь в указанный целевой каталог
`-t``–list`Вывести содержимое архива без извлечения
`-p``–preserve-permissions`Восстановить исходные права доступа к файлам в точности
`–strip-components=N`Удалить N ведущих компонентов пути из имён файлов

Важная деталь: Флаг `-f` всегда должен быть последним флагом перед именем файла. Написание `tar -xvzf` и `tar -xzvf` оба допустимы, но `tar -fxzv archive.tar.gz` завершится ошибкой, поскольку `-f` ожидает, что следующим аргументом будет путь к архиву.

Пошаговое руководство по извлечению

1. Откройте терминал

В большинстве настольных дистрибутивов Linux нажмите `Ctrl + Alt + T`. На сервере без графического интерфейса, доступном через SSH, вы уже находитесь в сеансе терминала.

2. Найдите ваш архив

“`bash

ls -lh /path/to/directory

“`

Убедитесь, что файл существует, и обратите внимание на его размер. Флаг `-h` отображает размеры в удобочитаемом формате (KB, MB, GB).

3. Извлечение на месте

Перейдите в каталог, содержащий архив, затем выполните извлечение:

“`bash

cd /path/to/directory

tar -xzvf archive-name.tar.gz

“`

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

4. Извлечение в указанный каталог

Используйте флаг `-C` для перенаправления вывода в любой целевой путь. Если целевой каталог не существует, сначала создайте его:

“`bash

mkdir -p /opt/myapp

tar -xzvf archive-name.tar.gz -C /opt/myapp

“`

Флаг `-p` для `mkdir` предотвращает ошибки, если каталог уже существует — хорошая привычка при написании скриптов.

Пример — развёртывание архива веб-приложения:

“`bash

mkdir -p ~/deployments/webapp-v2

tar -xzvf webapp-v2.tar.gz -C ~/deployments/webapp-v2

“`

5. Извлечение без подробного вывода

В автоматизированных скриптах, заданиях cron или конвейерах CI/CD подробный вывод создаёт лишний шум в журналах. Уберите флаг `-v`:

“`bash

tar -xzf archive-name.tar.gz -C /opt/myapp

“`

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

Просмотр содержимого архива без извлечения

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

“`bash

tar -tzvf archive-name.tar.gz

“`

Если в выводе отображаются пути, начинающиеся с `/` или `..`, извлекайте с осторожностью или используйте `–strip-components` для нормализации путей.

Чтобы проверить наличие обёртки в виде каталога верхнего уровня:

“`bash

tar -tzf archive-name.tar.gz | head -20

“`

Если все пути имеют общий префикс (например, `myapp-1.0/`), извлечение будет чистым. В противном случае создайте отдельный каталог и извлеките в него с помощью `-C`.

Работа с удалением компонентов пути

Распространённый реальный сценарий: вы загружаете исходный тарбол с GitHub, в котором всё упаковано внутри `project-main/`, но вам нужно, чтобы содержимое находилось непосредственно в `/opt/project/` без этого дополнительного уровня вложенности.

“`bash

tar -xzvf project-main.tar.gz -C /opt/project –strip-components=1

“`

`–strip-components=1` удаляет первый сегмент пути из каждого извлекаемого файла, фактически «разворачивая» каталог верхнего уровня. Это широко используется в скриптах развёртывания и Dockerfile.

Извлечение отдельного файла или каталога из архива

Не всегда нужно извлекать всё содержимое. Чтобы извлечь конкретный файл:

“`bash

tar -xzvf archive-name.tar.gz path/to/specific-file.conf

“`

Чтобы извлечь конкретный каталог со всем его содержимым:

“`bash

tar -xzvf archive-name.tar.gz path/to/specific-directory/

“`

Путь должен точно совпадать с тем, что выводит `tar -tzf`. Этот метод незаменим при восстановлении одного файла конфигурации из большого архива резервной копии без распаковки гигабайт данных.

Извлечение файлов .tar без сжатия gzip

Обычный файл `.tar` не имеет слоя сжатия. Полностью уберите флаг `-z`:

“`bash

tar -xvf archive-name.tar

“`

Сравнение: .tar.gz и другие распространённые форматы архивов

ФорматРасширениеАлгоритм сжатияСтепень сжатияСкоростьТребуется Tar
——–———–———————–——————-——-————–
Gzip тарбол`.tar.gz` / `.tgz`DEFLATE (gzip)УмереннаяБыстраяДа
Bzip2 тарбол`.tar.bz2`Burrows-Wheeler (bzip2)ВысокаяМедленнаяДа
XZ тарбол`.tar.xz`LZMA2 (xz)Очень высокаяОчень медленнаяДа
Zstandard тарбол`.tar.zst`ZstandardВысокаяОчень быстраяДа
ZIP архив`.zip`DEFLATEУмереннаяБыстраяНет
Обычный tar`.tar`НетНетСамая быстраяДа

Ключевое наблюдение: `.tar.xz` в настоящее время является предпочтительным форматом для пакетов дистрибутивов Linux (исходный код ядра, исходные тарболы RPM/DEB) благодаря превосходной степени сжатия. Однако `.tar.gz` остаётся доминирующим для общего распространения благодаря универсальной поддержке инструментария и скорости извлечения. `.tar.zst` (Zstandard) набирает популярность в современных дистрибутивах, таких как Arch Linux, благодаря исключительному балансу между степенью сжатия и скоростью.

Для извлечения этих альтернативных форматов замените `-z` соответствующим флагом:

“`bash

tar -xjvf archive.tar.bz2 # bzip2

tar -xJvf archive.tar.xz # xz/lzma

tar -x –zstd -vf archive.tar.zst # zstandard (GNU tar 1.31+)

“`

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

При извлечении архивов, содержащих системные файлы, скрипты или бинарные файлы приложений, сохранение прав доступа имеет важное значение:

“`bash

tar -xzvpf archive-name.tar.gz

“`

Флаг `-p` указывает tar восстанавливать исходные права доступа. Без него применяется umask текущего пользователя, что может незаметно нарушить работу исполняемых скриптов или бинарных файлов с setuid.

Для сохранения владельца (требуются права root):

“`bash

sudo tar -xzvpf archive-name.tar.gz –same-owner

“`

Это критически важно при восстановлении системных резервных копий или развёртывании пакетов приложений, которые зависят от конкретного владельца пользователя/группы для обеспечения границ безопасности.

Распространённые ошибки и способы их устранения

`tar: Error is not recoverable: exiting now`

Архив повреждён или загрузка была неполной. Проверьте целостность файла с помощью `md5sum` или `sha256sum` по опубликованной контрольной сумме, затем загрузите повторно.

`tar: Skipping to next header` / `tar: Archive contains obsolescent base-64 headers`

Частичное повреждение внутри архива. Можно попытаться выполнить частичное извлечение с помощью `–ignore-zeros`, но следует считать результат потенциально неполным.

`gzip: stdin: not in gzip format`

Файл имеет расширение `.tar.gz`, но фактически не сжат с помощью gzip. Запустите `file archive-name.tar.gz` для определения реального формата. Это может быть обычный `.tar`, файл `.zip` или `.bz2` с неправильным расширением.

`Cannot open: No such file or directory`

Либо путь неверен, либо имя файла содержит пробел. Заключите имя файла в кавычки: `tar -xzvf "my archive.tar.gz"`.

Отказ в доступе при извлечении

У вас нет прав на запись в целевой каталог. Используйте `sudo` или измените целевой каталог с помощью `-C` на каталог, которым вы владеете.

Практические сценарии использования на VPS или выделенном сервере

В среде VPS Хостинга архивы `.tar.gz` встречаются постоянно: развёртывание релизов приложений, восстановление дампов баз данных, передача наборов конфигураций между серверами и распаковка программного обеспечения, скомпилированного из исходного кода.

Типичный рабочий процесс развёртывания на сервере Linux:

“`bash

Download release archive

wget https://example.com/releases/myapp-2.1.0.tar.gz

Verify integrity

sha256sum myapp-2.1.0.tar.gz

Inspect contents before extracting

tar -tzf myapp-2.1.0.tar.gz | head -30

Extract to deployment directory

sudo mkdir -p /var/www/myapp

sudo tar -xzvpf myapp-2.1.0.tar.gz -C /var/www/myapp –strip-components=1

Set correct ownership

sudo chown -R www-data:www-data /var/www/myapp

“`

На Выделенных серверах, обрабатывающих резервные копии большого масштаба, объединение `tar` с каналами позволяет полностью избежать записи промежуточных файлов на диск:

“`bash

Create and stream a compressed archive directly over SSH to a remote server

tar -czvf – /var/www/html | ssh user@backup-server "cat > /backups/html-$(date +%F).tar.gz"

“`

Этот подход особенно эффективен, когда дисковое пространство ограничено или когда скорость резервного копирования критична.

Если вы управляете средой веб-хостинга через панель управления, такие инструменты, как VPS с cPanel, предоставляют операции `.tar.gz` через интерфейс файлового менеджера, однако базовая команда `tar` всегда доступна в терминале для скриптовых рабочих процессов.

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

Для команд, управляющих несколькими средами, Панели управления VPS могут упростить запланированные операции резервного копирования и восстановления, которые в значительной мере опираются на архивы `.tar.gz`.

Краткий справочник: наиболее используемые команды tar

“`bash

Extract .tar.gz to current directory

tar -xzvf archive.tar.gz

Extract to specific directory

tar -xzvf archive.tar.gz -C /target/dir

Extract silently (no verbose output)

tar -xzf archive.tar.gz -C /target/dir

List contents without extracting

tar -tzvf archive.tar.gz

Extract single file

tar -xzvf archive.tar.gz path/inside/archive/file.conf

Extract and strip top-level directory

tar -xzvf archive.tar.gz -C /target/dir –strip-components=1

Extract preserving permissions and ownership (as root)

sudo tar -xzvpf archive.tar.gz –same-owner

Extract .tar.bz2

tar -xjvf archive.tar.bz2

Extract .tar.xz

tar -xJvf archive.tar.xz

“`

Матрица технических решений

СценарийРекомендуемая команда
———-———————
Интерактивное извлечение, необходимо видеть прогресс`tar -xzvf archive.tar.gz`
Автоматизированный скрипт или задание cron`tar -xzf archive.tar.gz -C /target`
Неизвестная структура архива, сначала проверить`tar -tzf archive.tar.gzhead -20`
Развернуть в каталог без обёртки верхнего уровня`tar -xzf archive.tar.gz -C /target –strip-components=1`
Восстановить системную резервную копию с точными правами доступа`sudo tar -xzvpf archive.tar.gz –same-owner`
Восстановить один файл из большого архива`tar -xzf archive.tar.gz path/to/file`
Проверить целостность архива перед извлечением`tar -tzf archive.tar.gz > /dev/null && echo "OK"`

Часто задаваемые вопросы

В чём разница между .tar.gz и .tgz?

Это идентичные форматы. `.tgz` — это просто сокращённый псевдоним с одним расширением для `.tar.gz`, используемый в случаях, когда файловые системы или инструменты имеют ограничения на длину расширения. Оба извлекаются одной и той же командой `tar -xzvf`.

Почему `tar -xzvf` иногда извлекает файлы в текущий каталог вместо подкаталога?

Это происходит, когда архив был создан без обёртки в виде каталога верхнего уровня. Всегда запускайте `tar -tzf archive.tar.gz | head -20` перед извлечением. Если пути не имеют общего префикса, создайте отдельный каталог и используйте `-C` для извлечения в него, предотвращая разброс файлов.

Можно ли извлечь файл .tar.gz без команды tar?

Да. Можно сначала распаковать слой gzip с помощью `gunzip archive.tar.gz`, что создаст `archive.tar`, затем извлечь с помощью `tar -xvf archive.tar`. Некоторые системы также поддерживают `zcat archive.tar.gz | tar -xvf -` для передачи декомпрессии непосредственно в tar. Однако `tar -xzvf` в одной команде всегда является наиболее эффективным подходом.

Замедляет ли флаг `-v` извлечение больших архивов?

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

Как извлечь файл .tar.gz от имени другого пользователя без смены учётной записи?

Используйте `sudo -u targetuser tar -xzvf archive.tar.gz -C /target/dir`. Это запускает процесс извлечения под идентификатором целевого пользователя, обеспечивая правильное владение извлечёнными файлами без необходимости полной смены пользователя через `su`.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать