TAR (Tape ARchive): формат архивов и работа утилиты

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

+7 (800) 301-07-30

Реклама jurik.ru

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

Особенности и лучшие практики

  1. Порядок ключей имеет значение. Традиционно ключ -f должен быть последним среди буквенных флагов, так как сразу за ним идет имя файла. tar -czf archive.tar.gz dir — верно. tar -cfz archive.tar.gz dir — ошибка.
  2. Сохранение прав и владельцев. При создании бэкапов от root используйте -p (неявно включен для root). При распаковке от обычного пользователя права могут сброситься.
  3. Абсолютные пути. По умолчанию tar удаляет ведущий / при создании (предупреждение: Removing leading `/` from member names). Это безопасность: распаковка не перезапишет системные файлы. Используйте -P только если точно знаете, что делаете.
  4. Инкрементальные бэкапы. Ключ -g snapshot.file позволяет создавать инкрементальные архивы, сохраняющие только изменения с прошлого раза.
  5. Потоковая обработка (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 файл для любого поддерживаемого формата.