Утилита tar (Tape ARchive), это стандарт де-факто для архивации файлов в системах Linux и Unix․ Важно понимать: tar сам по себе не сжимает данные‚ он лишь объединяет множество файлов и каталогов в один непрерывный поток (архив)․ Для сжатия используются внешние алгоритмы: gzip‚ bzip2‚ xz или zstd․
Базовый синтаксис
tar [опции] [имя_архива] [файлы_или_каталоги] Ключевые опции (флаги)
Опции можно писать с дефисом (-c) или без (c, старый стиль BSD)․ Ниже приведены самые важные:
- -c‚ —create — создать новый архив․
- -x‚ —extract‚ —get — извлечь файлы из архива․
- -t‚ —list — показать содержимое архива (не распаковывая)․
- -f‚ —file=ARCHIVE — обязательная опция‚ указывает имя файла архива․ Всегда ставится последней в группе буквенных флагов․
- -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)․
- —exclude=PATTERN — исключить файлы по маске․
- —strip-components=N — при распаковке отбрасывать первые N компонентов пути (убирать верхние папки)․
Основные сценарии использования
Создание архива без сжатия (редко используется)
tar -cf archive․tar /path/to/directory Создание архива с gzip (самый популярный вариант‚ баланс скорости и размера)
tar -czf archive․tar․gz /path/to/directory Расшифровка: -c (создать)‚ -z (gzip)‚ -f (файл)․
Создание архива с xz (максимальное сжатие для передачи по сети/хранения)
tar -cJf archive․tar․xz /path/to/directory Создание архива с zstd (современный стандарт‚ рекомендуется для бэкапов)
tar --zstd -cf archive․tar․zst /path/to/directory Для многопоточного сжатия (ускорение на многоядерных CPU):
tar -I 'zstd -T0' -cf archive․tar․zst /path/to/directory Добавление подробного вывода (прогресс)
tar -czvf archive․tar․gz /path/to/directory Распаковка архивов
Автоматическое определение алгоритма сжатия
Современные версии tar умеют сами определять тип сжатия по магическим байтам файла․ Флаг -a (или --auto-compress) делает это автоматически:
tar -xaf archive․tar․gz
tar -xaf archive․tar․xz
tar -xaf archive․tar․zst Явное указание алгоритма (классический способ)
- gzip:
tar -xzf archive․tar․gz - bzip2:
tar -xjf archive․tar․bz2 - xz:
tar -xJf archive․tar․xz - zstd:
tar --zstd -xf archive․tar․zstилиtar -I zstd -xf archive․tar․zst
Распаковка в конкретную директорию
tar -xzf archive․tar․gz -C /target/directory Распаковка только конкретных файлов
tar -xzf archive․tar․gz path/to/file․txt another/path/logo․png Удаление верхнего уровня папок при распаковке (—strip-components)
Если архив содержит project_v1/file․txt‚ а вам нужно содержимое сразу в текущую папку:
tar -xzf archive․tar․gz --strip-components=1 Просмотр содержимого без распаковки tar -tzf archive․tar․gz # для gzip
tar -tJf archive․tar․xz # для xz
tar --zstd -tf archive;tar․zst # для zstd
tar -taf archive․tar․
Продвинутые техники
Исключение файлов и папок (—exclude)
tar -tzf archive․tar․gz # для gzip
tar -tJf archive․tar․xz # для xz
tar --zstd -tf archive;tar․zst # для zstd
tar -taf archive․tar․Создать бэкап домашней папки‚ исключая кэш‚ node_modules и ․git:
tar -czf backup_home․tar․gz /home/user
--exclude='/․cache/'
--exclude='/node_modules/'
--exclude='/․git/'
--exclude='․log' Важно: Шаблоны в --exclude сравниваются с полным путем внутри архива․ Используйте кавычки‚ чтобы оболочка не расширила звездочки сама․
Исключение через файл списка (—exclude-from)
Создайте файл exclude․txt:
․tmp
․log
/node_modules
/․git
/cache И запустите:
tar -czf backup․tar․gz -X exclude․txt /home/user Сохранение расширенных атрибутов и ACL (—acls —xattrs)
Критично для полных системных бэкапов:
tar -czpf system_backup․tar․gz --acls --xattrs /etc /var/www Создание архива через (stdin/stdout) для передачи по SSH
Копирование директории на удаленный сервер без создания промежуточного файла на диске:
tar -czf ‒ /path/local/dir | ssh user@remote "tar -xzf ‒ -C /path/remote/dir" Здесь - вместо имени файла означает stdout/stdin․
Добавление файлов в существующий архив (только для несжатых ․tar)
Нельзя добавлять файлы в сжатый архив (․tar․gz‚ ․tar․xz) без пересоздания․ Только в чистый ․tar:
tar -rf archive․tar new_file․txt Обновление архива (добавить только измененные/новые)
tar -uf archive․tar /path/to/directory Сравнение алгоритмов сжатия
| Алгоритм | Флаг | Расширение | Скорость сжатия | Размер файла | Применение |
|---|---|---|---|---|---|
| gzip | -z | ․tar․gz | Высокая | Средний | Универсальный стандарт‚ везде поддерживается․ |
| bzip2 | -j | ․tar․bz2 | Низкая | Хороший | Устарел‚ используется редко․ |
| xz (LZMA) | -J | ․tar․xz | Очень низкая | Лучший (максимум) | Дистрибутивы ПО‚ долгосрочное хранение‚ передача по медленным каналам․ |
| zstd (Zstandard) | --zstd | ․tar․zst | Очень высокая (многопоточность) | Отличный (близок к xz) | Рекомендуемый современный стандарт для бэкапов и логов․ |
Частые ошибки и советы
- Порядок флагов: Флаг
-fдолжен быть последним в группе‚ так как сразу за ним идет имя файла․tar -czf archive․tar․gz dir— верно․tar -cfz archive․tar․gz dir, ошибка (попытается создать архив с именем «z»)․ - Абсолютные пути: По умолчанию tar удаляет ведущий слеш
/при создании (предупреждение: «Removing leading ‘/’ from member names»)․ Это безопасность: при распаковке файлы не перезапишут системные файлы в корне․ Чтобы сохранить абсолютные пути используйте-P(или--absolute-names)‚ но будьте осторожны․ - Права доступа: Обычный пользователь не сохраняет владельца/группу (UID/GID) при создании‚ root — сохраняет․ При распаковке root восстанавливает владельцев‚ пользователь — файлы становятся его․ Используйте
--same-owner/--no-same-ownerдля контроля․ - Большие файлы (>8 ГБ): Старый формат GNU tar имеет ограничение․ Современные версии используют формат POSIX․1-2001 (pax) по умолчанию‚ который поддерживает файлы любого размера․ Если используете очень старые системы‚ может понадобиться флаг
--format=posix․ - Интеграция с find: Для сложной выборки файлов:
find /var/log -name '*․log' -mtime -7 -print0 | tar -czf logs_week․tar․gz --null -T -(
-print0+--null -T -безопасно работают с пробелами в именах)․
Утилита tar — мощный и гибкий инструмент․ Для повседневных задач достаточно запомнить пару комбинаций: tar -czf (создать gzip)‚ tar -xzf (распаковать gzip) и tar -tzf (посмотреть содержимое)․ Для серьезных бэкапов и работы с большими данными в 2024+ году настоятельно рекомендуется переходить на zstd (tar --zstd) за счет многопоточности и скорости․