TAR (Tape ARchive) — это стандартный формат архивных файлов и одноименная утилита командной строки, изначально разработанная для записи данных на магнитные ленты (отсюда и название). Сегодня это наиболее распространенный архиватор в Linux- и UNIX-системах, установленный по умолчанию практически во всех дистрибутивах.
Что такое TAR и как это работает?
Главное отличие tar от привычных пользователям Windows архиваторов (ZIP, RAR) заключается в разделении процессов упаковки и сжатия:
- TAR не сжимает данные сам по себе. Он лишь объединяет множество файлов и каталогов в один непрерывный поток байтов (так называемый «тарбол» или
.tar), сохраняя при этом структуру директорий, права доступа, владельцев, временные метки и символьные ссылки. - Сжатие выполняется внешними утилитами. Полученный
.tar-файл пропускают через компрессоры:gzip,bzip2,xzилиzstd.
Именно поэтому вы так часто видите расширения .tar.gz, .tgz, .tar.bz2, .tbz2, .tar.xz или .txz. Это TAR-архив, дополнительно сжатый соответствующим алгоритмом.
Важно: Файл
.zip— это коллекция сжатых файлов. Файл.tar.gz— это сжатая коллекция файлов. Это позволяет достичь лучшего коэффициента сжатия за счет поиска избыточности между файлами (solid-архив).
Основные режимы работы (операции)
Каждый запуск tar требует указания одной основной операции:
| Ключ (короткий) | Ключ (длинный) | Описание |
|---|---|---|
-c | --create | Создать новый архив. |
-x | --extract / --get | Распаковать файлы из архива. |
-t | --list | Показать список содержимого архива (не распаковывая). |
-r | --append | Добавить файлы в конец существующего архива. |
-u | --update | Добавить файлы, которые новее версий в архиве. |
-d | --diff / --compare | Сравнить архив с файловой системой. |
--delete | Удалить файлы из архива (не работает на магнитных лентах). |
Часто используемые модификаторы (опции)
Эти ключи комбинируются с основной операцией:
-f/--file=ARCHIVE— Обязательный ключ. Указывает имя файла архива. По умолчаниюtarпытается обратиться к ленточному накопителю/dev/rmt0.-v/--verbose— Подробный вывод (показывает список обрабатываемых файлов). Удобен для наблюдения, в скриптах лучше опускать.-z/--gzip— Фильтровать архив черезgzip(расширение.tar.gzили.tgz). Самый популярный баланс скорости и сжатия.-j/--bzip2— Фильтровать черезbzip2(расширение.tar.bz2или.tbz2). Сжатие лучше, но медленнее.-J/--xz— Фильтровать черезxz(расширение.tar.xzили.txz). Максимальное сжатие, очень медленное создание, быстрое распаковывание.--zstd— Фильтровать черезzstd(расширение.tar.zst). Современный стандарт: высокая скорость и хорошее сжатие.-C/--directory=DIR— Сменить каталог перед выполнением операций (критично при распаковке в конкретную папку).-p/--preserve-permissions— Сохранить права доступа (по умолчанию для root).-P/--absolute-names— Не убирать ведущий слеш/из путей (опасно при распаковке!).--exclude=PATTERN— Исключить файлы по маске (например,--exclude='*.log').--strip-components=N— Отбросить первые N компонентов пути при распаковке (убирает верхнюю папку архива).
Практические примеры (Шпаргалка)
Создание архивов
# Создать tar.gz (gzip) — стандарт де-факто
tar -czvf archive.tar.gz /path/to/source
tar -cJvf archive.tar.xz /path/to/source
tar --zstd -cvf archive.tar.zst /path/to/source
tar -cvf archive.tar /path/to/source
tar -czvf project.tar.gz --exclude='.git' --exclude='node_modules' .
Просмотр содержимого (без распаковки)
# Краткий список
tar -tvf archive.tar.gz
tar -tvvf archive.tar.gz
tar -tf archive.tar.gz
Распаковка архивов
# Распаковать в текущую папку (автоопределение компрессора по расширению в новых версиях tar)
tar -xvf archive.tar.gz
tar -xzvf archive.tar.gz # для gzip
tar -xJvf archive.tar.xz # для xz
tar --zstd -xvf archive.tar.zst # для zstd
tar -xvf archive.tar.gz -C /target/directory
tar -xvf archive.tar.gz path/inside/archive/file.txt
tar -xvf archive.tar.gz --strip-components=1 -C /target/directory
Добавление и обновление
# Добавить файл в существующий несжатый архив
tar -rvf archive.tar new_file.txt
tar -uvf archive.tar /path/to/source
Особенности и лучшие практики
- Порядок ключей имеет значение. Традиционно ключ
-fдолжен быть последним среди буквенных флагов, так как сразу за ним идет имя файла.tar -czf archive.tar.gz dir— верно.tar -cfz archive.tar.gz dir— ошибка. - Сохранение прав и владельцев. При создании бэкапов от root используйте
-p(неявно включен для root). При распаковке от обычного пользователя права могут сброситься. - Абсолютные пути. По умолчанию
tarудаляет ведущий/при создании (предупреждение: Removing leading `/` from member names). Это безопасность: распаковка не перезапишет системные файлы. Используйте-Pтолько если точно знаете, что делаете. - Инкрементальные бэкапы. Ключ
-g snapshot.fileпозволяет создавать инкрементальные архивы, сохраняющие только изменения с прошлого раза. - Потоковая обработка (Pipe).
tarотлично работает сstdin/stdout(указав-f -).# Копирование дерева каталогов с сохранением атрибутов (быстрее и надежнее cp -r) tar -cf ౼ /source/dir | (cd /dest/dir && tar -xpf -) tar -czf ⸺ /home/user | ssh user@server "cat > backup.tar.gz"
Сравнение алгоритмов сжатия
| Алгоритм | Расширение | Ключ tar | Скорость упаковки | Степень сжатия | Применение |
|---|---|---|---|---|---|
| gzip | .tar.gz, .tgz | -z | Высокая | Средняя | Универсальный стандарт, веб-серверы, логи |
| bzip2 | .tar.bz2, .tbz2 | -j | Низкая | Хорошая | Устаревает, заменяется xz/zstd |
| xz (LZMA2) | .tar.xz, .txz | -J | Очень низкая | Максимальная | Дистрибутивы Linux, пакеты, архивы на года |
| zstd | .tar.zst | —zstd | Очень высокая | Высокая (настраиваемая) | Современный стандарт ядра Linux, бэкапы, CI/CD |
Частые ошибки и их решения
tar: This does not look like a tar archive— Файл поврежден, не тот формат, или вы пытаетесь распаковать.gzбез флага-z(в старых версиях). Попробуйтеfile archive.tar.gzдля определения типа.tar: Removing leading `/` from member names— Это не ошибка, а предупреждение безопасности.tarзащищает вас от случайной перезаписи системных файлов при распаковке.Cannot open: No such file or directoryпри распаковке с-C, Целевая директория не существует. Создайте её заранее:mkdir -p /target/dir.- Аргимент список слишком длин при архивации миллионов файлов — Используйте
find . -print0 | tar --null -cf archive.tar -T -.
TAR, это фундаментальный инструмент экосистемы Linux/UNIX. Понимание его принципов (разделение контейнеризации и сжатия), знание базовых флагов (c, x, t, v, f, z, J) и умение работать с потоками (stdin/stdout) обязательны для любого системного администратора, DevOps-инженера или разработчика, работающего с *nix-системами. Современные реализации (GNU tar, BSD tar) поддерживают автоопределение компрессора при распаковке, что делает работу еще удобнее: достаточно запомнить tar -xvf файл для любого поддерживаемого формата.