Архивы и сжатие: 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 и зафиксируйте, какие метаданные сохранились в вашей системе.

Что важно запомнить

Источники