ServerAID
Найти гайд, команду, тег… ⌘ K
Shell и скрипты

Как распаковать tar.gz в Linux через терминал: tar, zip, xz и другие форматы

Короткий ответ — tar -xzf archive.tar.gz. Дальше разбираем, что означает каждая буква, как распаковать в нужный каталог, посмотреть содержимое до распаковки, вытащить один файл из большого архива и не поймать «tar-бомбу», которая раскидает сотни файлов по текущему каталогу.

Файл .tar.gz — это два действия в одном: tar собрал файлы в один поток, gzip его сжал. Отсюда и двойное расширение, и набор флагов в команде распаковки. Разбираем основную команду, остальные форматы архивов и приёмы, которые экономят время на сервере.

Основная команда

tar -xzf archive.tar.gz

Архив распакуется в текущий каталог. Что означает каждая буква:

  • x — extract, извлечь (создание — это c);
  • z — обработать через gzip;
  • f — дальше идёт имя файла архива.

Флаг f должен стоять последним в связке, потому что за ним следует имя файла. Запись tar -xzf работает, tar -xfz — нет.

Чтобы видеть, что именно распаковывается, добавляют v (verbose):

tar -xzvf archive.tar.gz

На архиве в десятки тысяч файлов вывод сам по себе замедляет распаковку, так что для больших архивов v лучше опускать.

Дефис перед флагами необязателен — исторический синтаксис tar xzf archive.tar.gz тоже работает.

Современный tar определяет сжатие сам

GNU tar в Ubuntu распознаёт тип сжатия по содержимому файла, поэтому флаг z можно не указывать вообще:

tar -xf archive.tar.gz
tar -xf archive.tar.bz2
tar -xf archive.tar.xz
tar -xf archive.tar.zst

Одна команда на все случаи. Флаги конкретных алгоритмов нужны в двух ситуациях: при создании архива (там надо явно сказать, чем сжимать) и на системах со старым или не-GNU tar, например в busybox-контейнерах.

Для справки, соответствие флагов и форматов:

Расширение Алгоритм Флаг Распаковка
.tar без сжатия tar -xf file.tar
.tar.gz, .tgz gzip z tar -xzf file.tar.gz
.tar.bz2, .tbz2 bzip2 j tar -xjf file.tar.bz2
.tar.xz, .txz xz J tar -xJf file.tar.xz
.tar.zst zstd --zstd tar --zstd -xf file.tar.zst
.tar.lz4 lz4 --lz4 tar --lz4 -xf file.tar.lz4

Заглавная J — это xz, строчная j — bzip2. Их легко перепутать.

Распаковываем в нужный каталог

По умолчанию tar кладёт файлы в текущий каталог. Указать другой — флаг -C:

mkdir -p /opt/myapp
sudo tar -xzf archive.tar.gz -C /opt/myapp

Каталог должен существовать: tar его не создаст и завершится ошибкой.

Часто архив содержит один корневой каталог (myapp-1.2.3/), а нужно положить его содержимое напрямую. Тогда пригодится --strip-components:

tar -xzf myapp-1.2.3.tar.gz -C /opt/myapp --strip-components=1

Флаг отбрасывает указанное количество уровней пути: вместо /opt/myapp/myapp-1.2.3/bin/app получится /opt/myapp/bin/app. Это стандартный приём при установке приложений из релизных архивов.

Смотрим содержимое до распаковки

Полезная привычка, особенно для архивов из интернета:

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

Флаг t (list) печатает список файлов, ничего не распаковывая. Посчитать количество файлов:

tar -tzf archive.tar.gz | wc -l

Подробный список с правами, владельцем и размерами:

tar -tvzf archive.tar.gz

Зачем это нужно — в двух словах: если все пути в архиве начинаются с общего каталога (myapp-1.2.3/...), распаковка аккуратна. Если же список начинается сразу с файлов, архив вывалит их прямо в текущий каталог, перемешав с вашими, — это и называют «tar-бомбой». Разгребать такое потом неприятно, поэтому проще проверить заранее либо распаковывать в свежий пустой каталог:

mkdir extracted && tar -xzf archive.tar.gz -C extracted

Отдельно стоит насторожиться, если в списке встречаются абсолютные пути (/etc/...) или ../. GNU tar по умолчанию срезает ведущий слэш и блокирует выход за пределы каталога, но проверить содержимое до распаковки всё равно правильнее.

Достаём один файл из архива

Указываем путь ровно так, как он выглядит в списке tar -t:

tar -xzf backup.tar.gz etc/nginx/nginx.conf

По маске:

tar -xzf backup.tar.gz --wildcards '*.conf'

Вывести файл на экран, не сохраняя на диск:

tar -xzOf backup.tar.gz etc/hostname

Заглавная O перенаправляет содержимое в stdout — удобно, чтобы быстро заглянуть в один конфиг из большого бэкапа, или передать дальше по конвейеру в grep.

Создаём архивы

tar -czf archive.tar.gz project/

Здесь c — create. Порядок аргументов: сначала имя создаваемого архива, потом что упаковывать.

С другими алгоритмами:

tar -cjf archive.tar.bz2 project/     # bzip2: плотнее gzip, медленнее
tar -cJf archive.tar.xz project/      # xz: ещё плотнее, ещё медленнее
tar --zstd -cf archive.tar.zst project/  # zstd: быстро и плотно

Выбрать сжатие по расширению автоматически — флаг -a:

tar -caf archive.tar.xz project/

Исключить лишнее:

tar -czf site.tar.gz /var/www/site \
  --exclude='*.log' \
  --exclude='node_modules' \
  --exclude='.git'

Каждый --exclude пишется отдельно, шаблоны — в кавычках, чтобы их не раскрыл шелл. Сообщение Removing leading '/' from member names — это норма: tar намеренно делает пути относительными, чтобы при распаковке архив не переписал системные каталоги.

Архив каталога сайта с датой в имени:

tar -czf /var/backups/site-$(date +%F).tar.gz -C /var/www site

Конструкция -C /var/www site кладёт в архив путь site/... вместо var/www/site/... — при распаковке это заметно удобнее. Такую команду обычно вешают задачей cron, а копии вывозят на другую машину через rsync.

Права и владельцы при распаковке

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

Под root tar по умолчанию восстанавливает исходных владельцев. Иногда это не нужно — например, при распаковке чужого архива в каталог сайта:

sudo tar -xzf site.tar.gz -C /var/www --no-same-owner
sudo chown -R www-data:www-data /var/www/site

Явно сохранить владельцев и права:

sudo tar -xzpf backup.tar.gz -C /

Флаг p восстанавливает права полностью, включая setuid-биты. Про владельцев и права подробнее — в статьях о chown и chmod.

Другие форматы

ZIP — отдельная утилита, ставится не всегда:

sudo apt install unzip zip

unzip archive.zip                # распаковать
unzip archive.zip -d /opt/app    # в конкретный каталог
unzip -l archive.zip             # посмотреть содержимое
zip -r archive.zip project/      # создать

Одиночный .gz (не архив, а сжатый файл):

gunzip file.txt.gz          # распаковать, исходный .gz удаляется
gzip -d file.txt.gz         # то же самое
zcat file.txt.gz | less     # прочитать, не распаковывая

Для сжатых логов есть готовые обёртки: zless, zgrep, zcat — они работают с .gz напрямую:

zgrep "error" /var/log/nginx/access.log.2.gz

7z — нужен отдельный пакет:

sudo apt install p7zip-full
7z x archive.7z             # распаковать с сохранением путей
7z l archive.7z             # список

RAR — только распаковка:

sudo apt install unrar
unrar x archive.rar

Прогресс распаковки

tar не показывает прогресс сам. Через pv:

sudo apt install pv
pv archive.tar.gz | tar -xzf - -C /opt/myapp

Дефис вместо имени файла означает «читать со стандартного ввода». Приблизительный процент по числу файлов даёт флаг --checkpoint:

tar -xzf archive.tar.gz --checkpoint=1000 --checkpoint-action=dot

Распаковка сразу после скачивания

Промежуточный файл можно не сохранять:

curl -fsSL https://example.com/app-1.2.tar.gz | tar -xz -C /opt/app --strip-components=1

Тот же приём с wget:

wget -qO- https://example.com/app-1.2.tar.gz | tar -xz -C /opt/app

Удобно для одноразовых установок и Dockerfile, где лишний слой с архивом не нужен. Оговорка та же, что и для любого «скачал и сразу выполнил»: содержимое архива в этот момент никем не проверено, так что для чего-то важнее тестового стенда лучше сначала скачать, сверить контрольную сумму и только потом распаковывать.

Частые вопросы

Как распаковать tar.gz одной командой?

tar -xzf archive.tar.gz — архив распакуется в текущий каталог. В современном GNU tar флаг z можно опустить: tar -xf archive.tar.gz определит gzip автоматически.

Чтобы распаковать в другой каталог, добавьте -C /путь/к/каталогу — каталог должен существовать заранее.

Что означают буквы в tar -xzvf?

x — извлечь (extract), z — обработать gzip, v — показывать имена файлов (verbose), f — следующий аргумент является именем файла архива.

Флаг f всегда идёт последним в связке, иначе tar примет за имя файла не тот аргумент. При создании архива вместо x ставится c (create).

Как посмотреть, что внутри архива, не распаковывая?

tar -tzf archive.tar.gz выведет список файлов. С подробностями — правами, владельцем, размером — tar -tvzf archive.tar.gz.

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

Чем отличается tar.gz от tar.xz и что выбрать?

Различие только в алгоритме сжатия. gzip быстрее всех и даёт средний результат, xz сжимает заметно плотнее, но упаковывает в разы медленнее, bzip2 находится посередине и сегодня почти вытеснен, zstd даёт плотность около xz при скорости около gzip.

Для ежедневных бэкапов практичен gzip или zstd, для дистрибутивов и архивов «упаковали один раз, скачивают многие» — xz.

Как распаковать архив в существующий каталог без вложенной папки?

Через --strip-components=1: tar -xzf app-1.2.3.tar.gz -C /opt/app --strip-components=1. Флаг отбрасывает первый уровень пути, и содержимое app-1.2.3/ ложится прямо в /opt/app.

Проверить структуру заранее поможет tar -tzf archive.tar.gz | head.

Что запомнить

  • tar -xzf archive.tar.gz — распаковать; x извлечь, z gzip, f имя файла, и f всегда последний.
  • Современный GNU tar сам определяет сжатие, так что tar -xf работает с .gz, .bz2, .xz и .zst одинаково.
  • -C каталог задаёт место распаковки, --strip-components=1 убирает лишний корневой каталог из архива.
  • Перед распаковкой незнакомого архива смотрите содержимое через tar -tzf или распаковывайте в свежий пустой каталог.
  • Для .zip нужен отдельный пакет unzip, для одиночных .gzgunzip, а читать сжатые логи можно через zgrep и zless.

Похожие материалы

Shell и скрипты

Команда lsblk в Linux: как посмотреть диски, разделы и точки монтирования

lsblk показывает все блочные устройства сервера деревом: диски, разделы, LVM-тома, шифрованные контейнеры и куда они смонтированы. Разбираем колонки вывода, флаг -f для файловых систем и UUID, свои наборы колонок через -o и типовые задачи — найти новый диск, собрать строку для fstab, понять структуру LVM.

Редакция
Shell и скрипты

Команды vi в Linux: режимы, навигация, поиск и замена — шпаргалка

Начнём с главного: выйти из vi — это Esc, затем :q! без сохранения или :wq с сохранением. Дальше — рабочий минимум команд, которого хватает для правки конфигов на сервере: режимы, перемещение, удаление и вставка, поиск с заменой и трюк для сохранения файла, который открыли без sudo.

Редакция
Shell и скрипты

Как скопировать файл в Linux через терминал: cp, rsync и scp с примерами

Разбираем копирование в терминале: cp для файлов и каталогов, флаг -a для сохранения прав и симлинков, rsync для больших объёмов и докачки, scp для переноса на другой сервер. Плюс ловушки со слэшем в конце пути и скрытыми файлами, на которых теряют данные.

Редакция
Shell и скрипты

Как удалить файл или каталог в Linux через терминал: rm, rmdir и безопасные привычки

Разбираем удаление в терминале: rm для файлов, rmdir для пустых каталогов, rm -r для каталогов с содержимым. Отдельно — чем опасен rm -rf, как удалить файл со странным именем, почему после удаления не освободилось место и как настроить автоочистку старых логов.

Редакция