Что такое tar.gz: упаковка и сжатие по отдельности
У многих возникает вопрос, чем tar отличается от zip. Программа tar сама по себе только склеивает множество файлов и папок в один файл-контейнер, сохраняя имена, структуру каталогов, права доступа и время изменения. Сжатие в ней не обязательно. Его добавляют отдельным шагом: gzip даёт расширение .gz, bzip2 даёт .bz2, xz даёт .xz.
Поэтому имя архива расшифровывается по частям. Файл с окончанием .tar.gz, он же .tgz, — это контейнер tar, сжатый gzip. Именно сохранение прав и владельцев делает tar привычным инструментом в Linux и macOS: при переносе папки со скриптами биты выполнения не теряются, а в обычных zip-архивах часть таких сведений может пропасть, в зависимости от программы.
Команда tar входит в базовый набор и в Linux, и в macOS, ничего устанавливать не нужно. В двух системах встречаются разные реализации (в Linux обычно GNU tar, в macOS bsdtar), но основные ключи у них совпадают. Нюансы вроде редких расширенных параметров лучше проверять в справке: man tar покажет то, что поддерживает ваша система.
Расшифровка ключей czvf, xzvf и tzf
Ключи tar — это набор одиночных букв, и дефис перед ними в большинстве случаев можно опустить, но с ним привычнее. Смысл каждой буквы простой.
| Ключ | Значение |
|---|---|
| c | create: создать архив |
| x | extract: извлечь содержимое |
| t | list: показать список файлов, ничего не распаковывая |
| z | пропустить через gzip (сжатие или распаковка) |
| j | то же для bzip2 |
| J | то же для xz |
| v | verbose: выводить имена файлов по ходу работы |
| f | следующий аргумент — имя файла архива |
Буква f должна идти последней в группе, потому что за ней сразу следует имя файла. Запись tar -czvf backup.tar.gz документы читается как: создать, сжать gzip, показывать ход работы, файл backup.tar.gz, упаковать папку «документы». При распаковке современные версии tar сами определяют тип сжатия по содержимому файла, так что tar -xf архив подойдёт и для .gz, и для .xz, но привычная явная буква ничему не вредит.
Упаковка: пошаговый порядок
Чтобы заархивировать папку, соблюдайте такую последовательность.
- Перейдите в папку, которая содержит нужный каталог: cd /путь/к/родителю. Это определит, какие пути запишутся в архив.
- Выполните tar -czvf имя.tar.gz имя_папки. Архив появится в текущем каталоге.
- Проверьте результат: tar -tzf имя.tar.gz | head покажет первые строки списка. Убедитесь, что пути относительные и начинаются с имени папки.
- Сравните размеры и при необходимости попробуйте распаковать во временную папку.
Пути в архиве важны. Если указать абсолютный путь вроде /home/user/docs, tar обычно отбросит начальный слэш и предупредит об этом, а в архиве сохранится длинная цепочка каталогов. Для переносимых архивов лучше упаковывать относительные пути из нужного места или использовать ключ -C, который задаёт каталог, откуда берутся файлы.
Если нужно исключить часть содержимого, например папку с временными файлами, используйте параметр --exclude с шаблоном. Забытое исключение — частая причина слишком большого архива, особенно когда внутри оказываются кэши и журналы.
Распаковка: куда и как безопасно
По умолчанию tar -xzf имя.tar.gz распаковывает всё в текущую папку, и если внутри не один каталог, а множество файлов, они рассыплются прямо среди ваших. Чтобы избежать беспорядка, сначала посмотрите список: tar -tzf имя.tar.gz | head. Если верхнего каталога нет, создайте отдельную папку и распакуйте в неё: mkdir новая и tar -xzf имя.tar.gz -C новая.
Если нужен один файл, его можно извлечь, указав путь так, как он записан в архиве: tar -xzf имя.tar.gz путь/к/файлу. Точный путь берут из вывода ключа t.
Меры осторожности при работе с чужими архивами:
- смотрите список перед извлечением: имена с .. или с абсолютными путями могут записать файлы за пределами выбранной папки; современные версии tar обычно защищаются от этого, но не стоит на это рассчитывать;
- не распаковывайте от имени администратора без необходимости: права и владельцы из архива применяются целиком;
- не запускайте скрипты из полученного архива, пока не прочитали их;
- проверяйте контрольную сумму, если она опубликована автором: это защищает от повреждённой загрузки.
Типичные ошибки и их смысл
Сообщения tar короткие, но понятные, если знать, о чём они говорят.
«Cannot open: No such file or directory» — неверное имя или путь архива, либо вы находитесь не в той папке. Проверьте ls и положение в файловой системе.
«gzip: stdin: not in gzip format» — файл не сжат gzip, хотя вы использовали ключ z. Причина может быть в неверном расширении или в том, что загрузка оказалась не архивом, а страницей с сообщением об ошибке. Проверьте команду file имя: она определит тип по содержимому.
«Unexpected EOF in archive» или «truncated» — архив обрезан, чаще всего из-за прерванной загрузки. Загрузите заново и сравните размер.
«Permission denied» при распаковке — у вас нет права записи в выбранную папку; выберите другой каталог, а не повышайте права без нужды. Подробнее о правах рассказывает справка по команде chmod.
Ошибка «tar: Removing leading / from member names» — не ошибка, а предупреждение: начальный слэш удалён, архив создан нормально.
Что выбрать: gzip, bzip2, xz или zip
Формат сжатия — компромисс между скоростью и размером. Gzip быстрый и распространён повсеместно, поэтому подходит по умолчанию. Bzip2 и xz обычно сжимают плотнее, но тратят больше процессорного времени; насколько именно, зависит от данных, поэтому универсальных цифр здесь не стоит ждать. Если важна скорость, оставайтесь на gzip, если нужно уменьшить большой архив для хранения — попробуйте xz.
Zip удобен, когда архив получает человек на другой системе, особенно на компьютере с Windows: такие файлы открываются штатными средствами. Для передачи между Linux и macOS tar.gz подходит лучше, так как сохраняет права доступа и структуру.
Для резервных копий важнее не формат, а проверка: попробуйте раз в какое-то время развернуть архив во временную папку и убедиться, что файлы читаются. Копия, которую ни разу не проверяли, остаётся предположением. Ключ -v полезен только при ручной работе; в автоматических задачах, которые вы запускаете по расписанию, его можно убрать, чтобы вывод не засорял журнал.