Архивы и сжатие: 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-метаданные; проверяйте именно нужные свойства.