Как распаковать 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извлечь,zgzip,fимя файла, иfвсегда последний.- Современный GNU tar сам определяет сжатие, так что
tar -xfработает с.gz,.bz2,.xzи.zstодинаково. -C каталогзадаёт место распаковки,--strip-components=1убирает лишний корневой каталог из архива.- Перед распаковкой незнакомого архива смотрите содержимое через
tar -tzfили распаковывайте в свежий пустой каталог. - Для
.zipнужен отдельный пакетunzip, для одиночных.gz—gunzip, а читать сжатые логи можно черезzgrepиzless.