Архивы и сжатие: tar, gzip и zip без потери структуры
Автор: Казачкин Даниил Михайлович · Обновлено
Архив объединяет дерево файлов и метаданные, а сжатие уменьшает поток байтов. tar решает первую задачу, gzip — вторую; формат ZIP обычно сочетает каталог архива и сжатые элементы. Различие важно для правильных команд и проверки результата.
Создание tar-архива с предсказуемыми путями
Опция -C меняет каталог для следующей части команды и позволяет не записывать случайный абсолютный префикс.
mkdir -p /tmp/archive-demo/project
printf 'config=true\n' >/tmp/archive-demo/project/app.conf
printf 'hello\n' >/tmp/archive-demo/project/README.txt
tar -C /tmp/archive-demo -czf /tmp/project.tar.gz project
tar -tzf /tmp/project.tar.gz-c создаёт, -t перечисляет, -x извлекает, -z подключает gzip, -f задаёт файл архива. Сначала просмотрите список: вы увидите корневой каталог, неожиданные временные файлы и абсолютные пути до записи на диск.
Извлечение в отдельный каталог
Никогда не распаковывайте неизвестный архив прямо в рабочий проект или /. Создайте пустой staging-каталог и проверьте результат.
mkdir -p /tmp/archive-demo/unpacked
tar -xzf /tmp/project.tar.gz -C /tmp/archive-demo/unpacked
find /tmp/archive-demo/unpacked -maxdepth 3 -printf '%y %p\n'Архив может содержать симлинки, необычные права и пути с ... Современный tar имеет защиты, но доверие к содержимому всё равно нельзя переносить на посторонний источник.
ZIP и переносимость
zip -r project.zip project создаёт архив, unzip -l project.zip показывает список, unzip -d staging извлекает. ZIP широко поддерживается, но Unix-права, владельцы и симлинки могут переноситься иначе между реализациями. Для backup Linux-дерева tar обычно лучше сохраняет ожидаемую модель метаданных; архив всё равно не заменяет проверенный backup.
Ошибка и диагностика
Типичная ошибка — перепутать tar.gz и простой gzip-поток или довериться расширению. Используйте file artifact, затем список tar -tf или unzip -l. Если извлечение завершилось неуспешно, не используйте частично созданное дерево: удалите точный staging-каталог и повторите после выяснения причины и проверки свободного места.
Практика
Создайте дерево с двумя каталогами, файлом с пробелом и симлинком. Соберите .tar.gz, перечислите содержимое, извлеките в новый путь и сравните типы через find -printf '%y %p\n'. Отдельно создайте ZIP и зафиксируйте, какие метаданные сохранились в вашей системе.
Что важно запомнить
- tar архивирует дерево, gzip сжимает один поток; расширение лишь подсказка.
- Проверяйте список до извлечения и распаковывайте в отдельный staging-каталог.
- Формат и инструмент по-разному сохраняют Unix-метаданные; проверяйте именно нужные свойства.
Частые вопросы
Почему gzip не сжимает каталог напрямую?
Он работает с одним потоком. Сначала tar превращает дерево в поток архива, затем gzip его сжимает.
Можно ли считать архив резервной копией?
Только если он хранится отдельно, регулярно проверяется восстановлением и включает нужные данные и метаданные. Один непроверенный файл рядом с оригиналом — слабая защита.
Что делает ключ -C у tar?
Он меняет рабочий каталог внутри операции, позволяя записывать относительные чистые пути и извлекать в контролируемую точку.
Связанные исследования
- Воспроизводимые сборки: как проверить связь исходников и артефакта — Почему один Git-коммит может давать разные байты: окружение, метаданные архивов и собственный опыт с детерминированной сборкой.