Утилита tar: создание, сжатие и распаковка архивов

Забудьте про путаницу с флагами! Простая шпаргалка по Tar: как запаковать, распаковать и сжать файлы без боли и страха терминала.

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Утилита 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)

Создать бэкап домашней папки‚ исключая кэш‚ 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) Рекомендуемый современный стандарт для бэкапов и логов․

Частые ошибки и советы

  1. Порядок флагов: Флаг -f должен быть последним в группе‚ так как сразу за ним идет имя файла․ tar -czf archive․tar․gz dir — верно․ tar -cfz archive․tar․gz dir, ошибка (попытается создать архив с именем «z»)․
  2. Абсолютные пути: По умолчанию tar удаляет ведущий слеш / при создании (предупреждение: «Removing leading ‘/’ from member names»)․ Это безопасность: при распаковке файлы не перезапишут системные файлы в корне․ Чтобы сохранить абсолютные пути используйте -P (или --absolute-names)‚ но будьте осторожны․
  3. Права доступа: Обычный пользователь не сохраняет владельца/группу (UID/GID) при создании‚ root — сохраняет․ При распаковке root восстанавливает владельцев‚ пользователь — файлы становятся его․ Используйте --same-owner / --no-same-owner для контроля․
  4. Большие файлы (>8 ГБ): Старый формат GNU tar имеет ограничение․ Современные версии используют формат POSIX․1-2001 (pax) по умолчанию‚ который поддерживает файлы любого размера․ Если используете очень старые системы‚ может понадобиться флаг --format=posix․
  5. Интеграция с 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) за счет многопоточности и скорости․