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-администратора.
Синтаксис
Компоненты команды
- OPERATION — одна из основных операций:
-c,-x,-t,-r,-u - -f ARCHIVE — имя файла архива (обязательно, кроме использования stdin/stdout)
- -v — verbose, показывать имена файлов при обработке
- -z/-j/-J/--zstd — тип сжатия (gzip/bzip2/xz/zstd)
- FILE... — файлы или директории для архивирования (при создании) или извлечения (при распаковке)
Флаги и опции
| Флаг | Описание |
|---|---|
-c | Create: создать новый архив. Требует -f и список файлов |
-x | eXtract: извлечь файлы из архива. С -C DIR — в указанную директорию |
-t | lisT: показать содержимое архива без извлечения. С -v выводит детали |
-f FILE | File: имя архива. Используй -f - для чтения/записи stdin/stdout (пайп) |
-v | Verbose: печатать имена обрабатываемых файлов. При -t добавляет права, размер, дату |
-z | gZip: применить gzip-сжатие. Расширение .tar.gz или .tgz |
-j | bzip2: применить bzip2-сжатие. Расширение .tar.bz2 или .tbz2 |
-J | xz: применить xz-сжатие. Расширение .tar.xz. Лучшее сжатие, медленнее |
--zstd | zstd: применить zstd-сжатие. Расширение .tar.zst. Современный алгоритм: быстро + хорошо сжимает |
-C DIR | Change directory: извлекать в директорию DIR (или упаковывать относительно неё) |
-p | Preserve 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/
Советы и предупреждения
Популярный мнемоник: 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 -xzf archive.tgz не проверяет, что архив не повреждён. Для верификации перед распаковкой используй: tar -tzf archive.tgz > /dev/null (exit code 0 = OK) или gzip -t archive.tgz. Для критичных бэкапов дополнительно сохраняй SHA256-хэш: sha256sum archive.tgz > archive.tgz.sha256.