Утилита tar (Tape ARchiver) — это стандарт де-факто для архивации файлов в Unix-подобных системах (Linux, macOS, BSD). Важно понимать: tar сам по себе не сжимает данные, он лишь объединяет множество файлов и каталогов в один непрерывный поток (архив). Сжатие происходит за счет использования дополнительных фильтров (gzip, bzip2, xz, zstd).
Базовый синтаксис
Общий формат команды выглядит так:
tar [опции] [имя_архива] [файлы_или_каталоги_для_упаковки] Ключевые опции (действия)
- -c (—create) — создать новый архив.
- -x (—extract, —get), извлечь файлы из архива.
- -t (—list) — показать содержимое архива без распаковки.
- -u (—update), добавить в архив только те файлы, которые новее версий в архиве.
- -r (—append) — дописать файлы в конец архива.
- —delete — удалить файлы из архива (не работает с сжатыми архивами на магнитных лентах/стандартном вводе).
Вспомогательные опции (модификаторы)
- -f (—file) — указать имя файла архива (обязательна в 99% случаев).
- -v (—verbose) — подробный вывод (показывать обрабатываемые файлы).
- -z (—gzip) — фильтрация через gzip (расширение .tar.gz или .tgz).
- -j (—bzip2), фильтрация через bzip2 (расширение .tar.bz2 или .tbz2).
- -J (—xz) — фильтрация через xz (расширение .tar.xz или .txz).
- —zstd / -I zstd — фильтрация через Zstandard (расширение .tar.zst), самый быстрый современный алгоритм.
- -C (—directory) — сменить каталог перед выполнением операций (полезно при распаковке).
- —exclude — исключить файлы по маске (например,
--exclude='*.log'). - -p (—preserve-permissions), сохранять права доступа (важно для бэкапов системы, работает по умолчанию для root).
- -P (—absolute-names) — не убирать ведущий слеш
/из путей (по умолчанию tar делает пути относительными для безопасности).
Основные сценарии использования
Создание архива без сжатия (просто упаковка)
Полезно для быстрой сборки множества мелких файлов в один контейнер, например, перед передачей по сети, где сжатие делается на уровне протокола (ssh, rsync).
tar -cf archive.tar /path/to/directory - -c: создать
- -f: файл архива
archive.tar
Создание архива с GZIP (самый популярный формат)
Хороший баланс скорости и степени сжатия. Совместим везде.
tar -czf archive.tar.gz /path/to/directory - -z: использовать gzip
Создание архива с XZ (максимальное сжатие)
Занимает меньше места, но создается дольше и требует больше оперативной памяти. Идеально для долгосрочного хранения и распространения пакетов.
tar -cJf archive.tar.xz /path/to/directory - -J (большая буква): использовать xz
Создание архива с ZSTD (современный стандарт: скорость + сжатие)
На данный момент лучший выбор для бэкапов. Сжимает в 3-5 раз быстрее gzip при сравнимой или лучшей степени сжатия. Требует установленного пакета zstd.
tar --zstd -cf archive.tar.zst /path/to/directory Или через универсальный флаг -I (позволяет передать параметры компрессора, например, уровень сжатия):
tar -I 'zstd -19 -T0' -cf archive.tar.zst /path/to/directory - -19: высокий уровень сжатия (по умолчанию 3).
- -T0: использовать все доступные ядра CPU.
Архивация с исключением файлов
Исключаем временные файлы, кэши, логи, папки node_modules, .git и т.д.
tar -czf project_backup.tar.gz /var/www/my_project
--exclude='.log'
--exclude='node_modules'
--exclude='.git'
--exclude='cache/' Важно: Шаблоны в --exclude сопоставляются с полным путем внутри архива. Лучше использовать относительные пути при создании.
Добавление файлов в существующий архив
Работает только с несжатыми архивами (.tar). Нельзя дописать в .tar.gz без пересоздания.
tar -rf archive.tar new_file.txt new_directory/ Распаковка и просмотр
Автоматическое определение компрессора (современные версии tar)
Современные версии GNU tar (начиная с 1.15+) умеют сами определять алгоритм сжатия по магическим байтам файла. Флаги -z, -j, -J, —zstd при распаковке не обязательны.
tar -xf archive.tar.gz
tar -xf archive.tar.xz
tar -xf archive.tar.zst Распаковка в конкретную папку
mkdir -p /target/directory
tar -xf archive.tar.gz -C /target/directory Просмотр содержимого без распаковки
tar -tf archive.tar.gz # Только имена файлов
tar -tvf archive.tar.gz # Подробно (права, владелец, размер, дата) Распаковка только конкретных файлов
tar -xf archive.tar.gz path/to/specific/file.txt another/dir/ Указание путей должно быть точным (как показывает tar -tf).
Извлечение в stdout (передача по конвейеру)
tar -xf archive.tar.gz -O large_file.sql | mysql -u user -p database Продвинутые техники и лучшие практики
Сохранение прав, владельцев и расширенных атрибутов (для бэкапов системы)
Если вы делаете бэкап системы от пользователя root, tar по умолчанию сохраняет права. Для гарантии используйте:
tar -cpf backup.tar /etc /home /var/www - -p (—preserve-permissions): сохранять режимы файлов, владельца, временные метки.
- —xattrs: сохранять расширенные атрибуты (SELinux, capabilities).
- —acls: сохранять списки контроля доступа (ACL).
Идеальная команда для полного бэкапа системы:
tar -cpf system_backup.tar --xattrs --acls --one-file-system / - —one-file-system: не переходить на другие файловые системы (исключает
/proc,/sys,/dev,/run, смонтированные диски).
Использование файла со списком исключений
Удобно для регулярных бэкапов. Создайте файл exclude.list:
# exclude.list
/proc/*
/sys/*
/dev/*
/run/*
/tmp/*
/var/tmp/*
/lost+found
/var/log/.gz
/home//.cache
/root/.cache Команда:
tar -cpf backup.tar -X exclude.list / Многопоточное сжатие (ускорение на многоядерных CPU)
- pigz (параллельный gzip):
tar -cf ─ /dir | pigz -9 > archive.tar.gz - pbzip2 (параллельный bzip2):
tar -cf ౼ /dir | pbzip2 -9 > archive.tar.bz2 - xz (нативно):
tar -cf ౼ /dir | xz -9 -T0 > archive.tar.xz - zstd (нативно, лучший выбор):
tar -cf ─ /dir | zstd -19 -T0 > archive.tar.zst
Синтаксис tar -cf ─ ... | compressor > file дает больший контроль над параметрами сжатия, чем встроенные флаги tar.
Создание инкрементальных бэкапов (snapshot)
Tar поддерживает инкрементальные архивы через файл-снимок (snapshot file).
- Полный бэкап (уровень 0):
tar -cpf full_backup.tar --listed-incremental=snapshot.snar /home/user - Инкрементальный бэкап (уровень 1): (создает архив только с изменениями)
tar -cpf inc_backup_1.tar --listed-incremental=snapshot.snar /home/user - Для восстановления нужно распаковать полный, затем наложить инкрементальные по порядку.
- Создать .tar.gz:
tar -czf name.tar.gz dir/ - Создать .tar.xz:
tar -cJf name.tar.xz dir/ - Создать .tar.zst (рекомендую):
tar --zstd -cf name.tar.zst dir/ - Распаковать любой:
tar -xf archive.tar.* - Распаковать в папку:
tar -xf archive.tar.gz -C /path/to/dir - Посмотреть содержимое:
tar -tf archive;tar.gz - С бэкап-опциями (права, атрибуты, ACL):
tar -cpf backup.tar --xattrs --acls --one-file-system / - Исключить мусор:
tar -czf backup.tar.gz /src --exclude='*.log' --exclude='node_modules' - Многопоточный zstd (макс. скорость):
tar -cf ౼ /src | zstd -T0 -19 > backup.tar.zst
Проверка целостности архива
# Тест чтения (проверка CRC/контрольных сумм внутри компрессора)
tar -tzf archive.tar.gz > /dev/null
echo $? # 0 = ок, не 0 = ошибка чтения/повреждение Распространенные ошибки и их решения
«tar: Removing leading ‘/’ from member names»
Причина: Вы указали абсолютный путь /home/user. Tar по умолчанию делает пути относительными для безопасности (чтобы при распаковке не перезаписать системные файлы).
Решение: Это предупреждение, не ошибка. Все пройдет нормально. Чтобы убрать сообщение, заходите в каталог выше и упаковывайте относительный путь:
cd /home
tar -czf user_backup.tar.gz user Или используйте флаг -P (не рекомендуется для бэкапов системы).
«tar: Archive is compressed. Use -z option» (старая ошибка)
На очень старых версиях tar (или не-GNU tar, например, на Solaris/AIX) нужно явно указывать флаг компрессора при распаковке (-xzf). В современном Linux (GNU tar) это не нужно, используйте просто -xf.
Ошибка «File changed as we read it»
Файл изменился в момент чтения. Для живых систем (базы данных, логи) это нормально.
Решение: Игнорировать (файл попадет в архив в неконсистентном состоянии) или остановить сервис. Для консистентных бэкапов БД используйте снапшоты LVM/ZFS/Btrfs или утилиты вроде mysqldump/pg_dump перед тарированием.
Аргумент слишком длинный (Argument list too long)
При попытке заархивировать миллионы файлов через tar -cf arch.tar * оболочка не может развернуть звездочку.
Решение: Передавайте каталог, а не список файлов:
tar -cf arch.tar /path/to/dir_with_millions_of_files Или используйте find с -print0 и tar --null -T -.
Сравнение алгоритмов сжатия (ориентировочно)
| Алгоритм | Расширение | Скорость сжатия | Степень сжатия | Скорость распаковки | Применение |
|---|---|---|---|---|---|
| gzip | .tar.gz, .tgz | Быстрая | Средняя | Очень быстрая | Универсальный стандарт, передача в вебе, логи |
| bzip2 | .tar.bz2, .tbz2 | Медленная | Хорошая | Медленная | Устарел, почти не используется |
| xz (LZMA2) | .tar.xz, .txz | Очень медленная | Очень высокая | Средняя | Распространение ПО, долгосрочное хранение, ядро Linux |
| zstd (Zstandard) | .tar.zst | Очень быстрая (многопоточная) | Высокая (настраиваемая) | Очень быстрая | Лучший выбор для бэкапов, логов, контейнеров, системных образов |
| lz4 | .tar.lz4 | Экстремально быстрая | Низкая | Экстремально быстрая | Real-time бэкапы, межсерверная синхронизация |
Краткая шпаргалка (Cheat Sheet)
Утилита tar — это «швейцарский нож» системного администратора и разработчика в экосистеме Linux. Освоение базовых флагов (-c, -x, -f, -v) и понимание того, как подключать компрессоры (-z, -J, --zstd), покрывает 95% повседневных задач.
Для современных задач настоятельно рекомендую переходить на Zstandard (.tar.zst), он выигрывает у gzip и по скорости, и по степени сжатия, а также отлично масштабируется на многоядерных процессорах. Для максимальной совместимости (например, отправка архива пользователю Windows без сторонних инструментов) оставайтесь на gzip (.tar.gz).
Помните про безопасность путей (tar по умолчанию убирает ведущий слеш) и используйте файлы исключений для чистых бэкапов проектов.