TAR (Tape ARchive) — это формат файла и утилита командной строки для объединения множества файлов в один архивный файл. Изначально разработанный для записи на магнитные ленты (отсюда и название), сегодня он является стандартом де-факто в Unix/Linux-системах для распространения исходного кода, бэкапов и пакетов программного обеспечения.
История и суть формата
Формат появился в 1979 году в составе Version 7 Unix. Главная особенность TAR — он не сжимает данные сам по себе. Он лишь последовательно склеивает файлы, сохраняя их метаданные (имена, права доступа, владельца, временные метки, структуру каталогов) в специальных заголовках.
Именно поэтому TAR-файлы почти всегда используются в связке с утилитами сжатия:
- .tar.gz или .tgz — TAR + Gzip (самый популярный вариант, баланс скорости и степени сжатия).
- .tar.bz2 или .tbz2, TAR + Bzip2 (лучшее сжатие, но медленнее).
- .tar.xz или .txz — TAR + XZ (максимальное сжатие, стандарт для дистрибутивов Linux, например, Arch Linux);
- .tar.zst, TAR + Zstandard (современный алгоритм, очень высокая скорость распаковки).
Внутренняя структура TAR-файла
TAR-файл представляет собой поток байтов, состоящий из блоков по 512 байт. Структура проста:
- Заголовок файла (Header) — 512 байт, содержащие метаданные: имя файла (до 100 байт в старом формате), режим (права), UID/GID, размер, время модификации, контрольную сумму, тип файла (обычный, каталог, симлинк и т.д.) и имя связанного файла (для ссылок).
- Данные файла — содержимое файла, выровненное до блока 512 байт (добивается нулями).
- Повторение — для каждого файла в архиве.
- Конец архива — два и более пустых блока (заполненных нулями).
Важно: Из-за лимита 100 байт на имя файла в оригинальном формате (v7), были разработаны расширения: USTAR (POSIX.1-1988) и PAX (POSIX.1-2001). Они позволяют хранить длинные имена, большие файлы (> 8 ГБ), кодировку UTF-8, расширенные атрибуты и ACL.
Основные команды (Linux / macOS / WSL)
Утилита tar имеет множество флагов. Самые частые комбинации:
Создание архива
# Создать архив с сжатием gzip (-z), показать процесс (-v), в файл (-f)
tar -czvf archive.tar.gz /path/to/directory
tar -cJvf archive.tar.xz /path/to/directory
tar -cvf archive.tar /path/to/directory
Распаковка архива
# Распаковать (-x) с автоматическим определением сжатия (-a), показать файлы (-v)
tar -xavf archive.tar.gz
tar -xavf archive.tar.gz -C /target/directory
Просмотр содержимого без распаковки
tar -tvf archive.tar.gz
Добавление файлов в существующий архив (только для несжатых .tar)
tar -rvf archive.tar newfile.txt
Лайфхак: Флаг
-a(auto-compress) сам определяет алгоритм сжатия по расширению файла (.gz, .xz, .zst и т.д.). Не нужно запоминать-z,-J,--zstd.
TAR в Windows
Раньше в Windows требовались сторонние программы (7-Zip, WinRAR). Начиная с Windows 10 (build 17063) и Windows 11, утилита tar.exe встроена в систему и доступна в PowerShell и CMD.
# PowerShell / CMD
tar -xvf archive.tar.gz
tar -czvf archive.tar.gz folder_name
Также полноценно поддерживается в WSL (Windows Subsystem for Linux).
Сравнение TAR с ZIP и RAR
| Характеристика | TAR (+ gzip/xz) | ZIP | RAR |
|---|---|---|---|
| Сжатие | Отдельный этап (solid-архив) | Пофайловое | Solid-архив (по умолчанию) |
| Права доступа (chmod) | Полная поддержка | Ограниченная (только в расширениях Info-ZIP) | Поддерживается |
| Символические/Жесткие ссылки | Да | Нет (превращаются в копии) | Да |
| Владелец (UID/GID) | Да | Нет | Да |
| Скорость добавления 1 файла | Низкая (перезапись всего архива) | Высокая | Средняя |
| Степень сжатия (solid) | Лучшая (словарь общий для всех файлов) | Хуже (словарь на файл) | |
| Стандартизация | POSIX.1-2001 (PAX) | PKWARE / ISO/IEC 21320-1 | Проприетарный (RAR5 открыт частично) |
Типичные сценарии использования
- Распространение ПО в Linux: Исходники ядра, утилит, бинарные релизы на GitHub (Releases) почти всегда в
.tar.gzили.tar.xz. - Резервное копирование (Backup):
tarидеален для инкрементальных бэкапов (флаг-g/--listed-incremental), сохраняет все атрибуты файловой системы. - Docker/Контейнеры: Образы Docker по сути являются слоями в формате TAR (с метаданными JSON).
docker saveиdocker exportвыдают .tar. - Перенос файловых систем:
tar -cf ― /src | (cd /dst && tar -xf -), классический способ клонировать систему с сохранением всех прав, ссылок и спецфайлов.
Частые проблемы и решения
Ошибка «tar: Exiting with failure status due to previous errors»
Часто бывает из-за прав доступа (Permission denied) при чтении файлов. Решение: запускать от sudo или исключать проблемные папки (--exclude=/proc --exclude=/sys --exclude=/dev).
Проблемы с длинными именами файлов (> )
Старые версии tar или нестандартные реализации могут обрезать имена. Используйте формат PAX (современный стандарт):
tar --format=pax -cvf archive.tar /path/with/very/long/names
«File changed as we read it»
Предупреждение, а не ошибка. Файл менялся во время архивации (логи, БД). Для консистентности БД нужно останавливать сервис или использовать снапшоты LVM/ZFS/Btrfs.
Распаковка на FAT32/exFAT
Файловые системы без поддержки прав доступа (FAT32, exFAT) не сохранят атрибуты chmod, владельца и симлинки. При распаковке на флешке все файлы станут исполняемыми или принадлежать текущему пользователю.
Продвинутые трюки
Исключение файлов/папок
tar -czvf backup.tar.gz /home/user --exclude='*.cache' --exclude='node_modules' --exclude='.git'
Потоковая передача по SSH (без создания промежуточного файла)
# Сжать папку на локальной машине и сразу развернуть на сервере
tar -czf ― /local/path | ssh user@server "tar -xzf ― -C /remote/path"
Сохранение расширенных атрибутов (xattr) и ACL
# GNU tar 1.27+
tar --acls --xattrs -cvf archive.tar /path
Инкрементальный бэкап
# Первый полный бэкап (создает файл-снимок snapshot.snar)
tar -czvf backup-full.tar.gz -g backup.snar /home/user
tar -czvf backup-inc1.tar.gz -g backup.snar /home/user
TAR — это «клей» для файлов в Unix-мире. Он не сжимает, но идеально сохраняет структуру файловой системы: права, владельцев, ссылки, спецфайлы. В связке с современными компрессорами (zstd, xz, gzip) он остается золотым стандартом для дистрибуции ПО, системных бэкапов и контейнеров.
Понимание флагов -c, -x, -v, -f, -a, --exclude и умение работать с потоками (- вместо файла) — базовый навык любого разработчика, DevOps-инженера или администратора Linux.