tar -xf archive.tar.gz распаковывает tar, tar.gz, tar.bz2, tar.xz и tar.zst — современный tar сам определяет сжатие по содержимому файла, без единого флага. Вторая привычка, которая экономит нервы, — посмотреть, что внутри незнакомого архива, прежде чем его распаковывать: без общей папки внутри всё содержимое раскидает по текущему каталогу.
1. Сначала посмотреть, что внутри
$ clai покажи, что лежит в этом архиве, не распаковывая→ tar -tf arch.tar.gz | head -4d/d/b/d/b/two-copy.txtd/a/
-t это список. Если все пути начинаются с одного каталога — архив аккуратный. Если в списке ./file1, ./file2 без общей папки, распаковка раскидает всё по текущему каталогу.
2. Распаковать, не думая о типе сжатия
$ clai распакуй этот архив→ tar -xf arch.tar.gz
Современный GNU tar сам определяет gzip, bzip2, xz и zstd по содержимому. Флаги z, j, J нужны только старым версиям и при создании архива. Одна команда на все tar-подобные форматы.
3. Распаковать в отдельный каталог
$ clai распакуй архив в папку out→ mkdir -p out && tar -xf arch.tar.gz -C out
-C меняет каталог до распаковки. Это же и защита от «архивной бомбы» из первой секции: даже если внутри нет общей папки, мусор окажется в out, а не у вас под ногами.
4. Достать один файл
$ clai достань из архива только файл d/a/three.txt→ tar -xf arch.tar.gz d/a/three.txt
Путь указывается ровно так, как он выглядит в выводе tar -tf. Не угадывайте — скопируйте из списка.
5. Другие форматы
$ clai распакуй этот zip в папку out→ unzip -d out archive.zip
У unzip каталог задаётся через -d, а не -C. Для 7z это 7z x archive.7z -oout — без пробела после -o, иначе он поймёт это как имя файла. Каждый инструмент придумал свой флаг для одного и того же.
6. Не распаковывать ради одного грепа
$ clai поищи слово error в архиве, не распаковывая его→ tar -xzOf logs.tar.gz | grep -n 'error' | head
-O выводит содержимое файлов в стандартный поток вместо записи на диск. Для архива логов на несколько гигабайт это разница между «сразу» и «сначала найдите 10 гигабайт свободного места».
Грабли
- Флаг
fдолжен идти последним в связке.tar -xfzпытается использоватьzкак имя файла. Правильноtar -xzfили простоtar -xf. .tar.gzи.tgz— одно и то же. Как и.tar.bz2с.tbz2. Расширение ничего не решает, tar смотрит на содержимое.- Архив с абсолютными путями опасен. Если в выводе
tar -tfпути начинаются с/, распаковка может перезаписать системные файлы. Такой архив распаковывайте только с-Cв отдельный каталог и после просмотра списка.
Похожие вопросы
Как посмотреть размер файлов внутри архива? tar -tvf archive.tar.gz — v добавляет права, владельца, размер и дату.
Почему unzip ругается на кириллицу в именах? Кодировка имён в zip не стандартизована. Помогает unzip -O CP866 для архивов из Windows.
Как распаковать несколько архивов разом? for f in *.tar.gz; do tar -xf "$f" -C "${f%.tar.gz}"; done, предварительно создав каталоги.
Читайте также
- Заархивировать этот каталог и загрузить в S3
- Почистить старые логи и бэкапы одной фразой
- Найти и заменить во всех файлах проекта
CliAI сам подберёт нужную команду для любого архива, вместе со всеми флагами. Установка одной строкой.