linux scripting

tar

Архивирование файлов — создание, просмотр и извлечение tar-архивов с поддержкой сжатия

Описание

tar (Tape ARchive) — стандартная утилита архивирования в Unix/Linux, первоначально разработанная для записи данных на магнитные ленты. Несмотря на название, сегодня tar используется преимущественно для создания файловых архивов на диске. В отличие от zip, tar сначала упаковывает файлы в единый поток (без сжатия), а затем опционально применяет компрессор — gzip, bzip2, xz, zstd или другой. Это архитектурное решение позволяет передавать архивы по пайпу в реальном времени.

Форматы архивов: .tar — без сжатия; .tar.gz / .tgz — с gzip-сжатием (быстро, умеренное сжатие); .tar.bz2 / .tbz2 — с bzip2 (медленнее, лучше сжатие); .tar.xz / .txz — с xz (самое лучшее сжатие, медленнее всего); .tar.zst — с zstd (современный формат: быстро и хорошее сжатие). GNU tar (установлен в Linux) автоматически определяет формат при распаковке.

tar используется повсеместно: бэкапы серверов и данных, деплой приложений, дистрибуция исходного кода, Docker-образы (слои образов — это tar-архивы), упаковка для переноса между системами. Умение читать и создавать tar-архивы — базовый навык Linux-администратора.

Синтаксис

tar [OPERATION] [OPTIONS] [ARCHIVE] [FILE...] # Основные операции (одна обязательна): tar -c ... # create — создать архив tar -x ... # extract — извлечь из архива tar -t ... # list — просмотреть содержимое tar -r ... # append — добавить файлы к существующему архиву tar -u ... # update — обновить файлы в архиве (новее существующих) tar -d ... # diff — сравнить архив с файловой системой

Компоненты команды

Флаги и опции

ФлагОписание
-cCreate: создать новый архив. Требует -f и список файлов
-xeXtract: извлечь файлы из архива. С -C DIR — в указанную директорию
-tlisT: показать содержимое архива без извлечения. С -v выводит детали
-f FILEFile: имя архива. Используй -f - для чтения/записи stdin/stdout (пайп)
-vVerbose: печатать имена обрабатываемых файлов. При -t добавляет права, размер, дату
-zgZip: применить gzip-сжатие. Расширение .tar.gz или .tgz
-jbzip2: применить bzip2-сжатие. Расширение .tar.bz2 или .tbz2
-Jxz: применить xz-сжатие. Расширение .tar.xz. Лучшее сжатие, медленнее
--zstdzstd: применить zstd-сжатие. Расширение .tar.zst. Современный алгоритм: быстро + хорошо сжимает
-C DIRChange directory: извлекать в директорию DIR (или упаковывать относительно неё)
-pPreserve permissions: сохранить права доступа (владелец, группа, биты). Нужен root для восстановления владельца
--strip-components=NУбрать N начальных компонентов пути при извлечении. Полезно когда в архиве лишний верхний каталог
--exclude=PATTERNИсключить файлы/директории, соответствующие шаблону glob. Пример: --exclude='*.log'
-X FILEИсключить файлы, перечисленные в FILE (один паттерн на строку)
--newer=DATEВключить в архив только файлы новее указанной даты или файла
-T FILEСписок файлов для архивирования из файла FILE (один путь на строку). Для больших списков
--totalsВывести итоговый размер архива после завершения операции

Паттерны использования

Создание архивов

# .tar.gz — самый распространённый формат
tar -czvf archive.tar.gz /path/to/dir/

# .tar.bz2 — лучшее сжатие текста
tar -cjvf archive.tar.bz2 /path/to/dir/

# .tar.xz — максимальное сжатие
tar -cJvf archive.tar.xz /path/to/dir/

# .tar.zst — быстрое современное сжатие
tar --zstd -cvf archive.tar.zst /path/to/dir/

# Без сжатия (быстро, для сетевой передачи)
tar -cvf archive.tar /path/to/dir/

Извлечение архивов

# Извлечь в текущую директорию
tar -xzvf archive.tar.gz

# Извлечь в конкретную директорию
tar -xzvf archive.tar.gz -C /opt/

# Извлечь только конкретный файл/каталог
tar -xzvf archive.tar.gz path/to/file.txt

# Убрать верхний каталог при извлечении
tar -xzvf archive.tar.gz --strip-components=1 -C /opt/myapp/

# Auto-detect сжатия (GNU tar)
tar -xvf archive.tar.gz
tar -xvf archive.tar.bz2
tar -xvf archive.tar.xz

Просмотр содержимого

# Список файлов в архиве
tar -tzf archive.tar.gz

# Подробный список (права, размер, дата)
tar -tvzf archive.tar.gz

# Найти файл в архиве
tar -tzf archive.tar.gz | grep "config"

# Первые 20 файлов
tar -tzf big-archive.tar.gz | head -20

# Размер распакованного архива
tar -tzf archive.tar.gz | awk '{sum+=$3} END {print sum/1024/1024 " MB"}'

Исключение файлов и директорий

# Исключить конкретную директорию
tar -czvf backup.tar.gz /var/www/ \
  --exclude='/var/www/cache'

# Исключить по паттерну
tar -czvf src.tar.gz /opt/myapp/ \
  --exclude='*.pyc' \
  --exclude='__pycache__' \
  --exclude='.git' \
  --exclude='node_modules'

# Список исключений из файла
echo -e '*.log\n*.tmp\n.cache' > exclude.txt
tar -czvf backup.tar.gz /opt/app/ -X exclude.txt

Бэкап и восстановление с правами

# Полный бэкап с сохранением прав (от root)
tar -cpzf /backup/home_$(date +%Y%m%d).tar.gz /home/

# Инкрементальный бэкап (новее чем файл)
tar -czf /backup/inc_$(date +%Y%m%d).tar.gz \
  --newer=/backup/.last_backup /var/www/

touch /backup/.last_backup

# Восстановление с сохранением прав
tar -xpzf /backup/home_20240101.tar.gz -C /

# Проверка целостности архива
tar -tzf backup.tar.gz > /dev/null && echo "OK" || echo "CORRUPTED"

Tar через пайп и сеть

# Копировать дерево каталогов с сохранением атрибутов
tar -cpf - /src/ | tar -xpf - -C /dst/

# Передача по SSH
tar -czf - /opt/myapp/ | ssh user@server "tar -xzf - -C /opt/"

# Создать архив и сразу передать по pv (с прогрессом)
tar -czf - /var/backups/ | pv | ssh backup-server "cat > backup.tar.gz"

# Распаковать прямо из URL
curl -L https://example.com/release.tar.gz | tar -xzf - -C /opt/

Советы и предупреждения

Совет: запоминалка флагов — "eXtract Ze Files"
Популярный мнемоник: create, extract, table of contents (list) — основные операции. z=gzip, j=bzip2, J=xz, f=file, v=verbose. Типичные команды: создать tar -czvf arch.tgz dir/, распаковать tar -xzvf arch.tgz, просмотреть tar -tzvf arch.tgz.
Совет: выбор алгоритма сжатия
Для бэкапов с передачей по сети — --zstd (zstd): лучший баланс скорости и степени сжатия в 2024+. Для хранения архивов кода — -J (xz): максимальное сжатие. Для быстрых временных архивов — -z (gzip): быстро, совместимо везде. Для пайпов и потоковой передачи — -z или без сжатия.
Внимание: ведущий слеш и абсолютные пути
При создании архива GNU tar по умолчанию удаляет ведущий / из путей и выводит предупреждение "Removing leading / from member names". Это защита: извлечение в / не перезапишет системные файлы. Для архивов, которые должны распаковываться в корень (полный бэкап системы), используй флаг -P или --absolute-names — но с пониманием последствий.
Внимание: tar не проверяет целостность автоматически
Команда tar -xzf archive.tgz не проверяет, что архив не повреждён. Для верификации перед распаковкой используй: tar -tzf archive.tgz > /dev/null (exit code 0 = OK) или gzip -t archive.tgz. Для критичных бэкапов дополнительно сохраняй SHA256-хэш: sha256sum archive.tgz > archive.tgz.sha256.