linux-labs

Вики / Базовые команды

tar (архивы)

Команда GNU tar БазовоеФайлыБэкап

Создание и распаковка архивов tar/gz/xz; бэкап каталогов.

tar собирает дерево файлов в один архив (.tar), часто со сжатием (.tar.gz, .tar.xz). Мнемоника флагов: create / extract / tlist, verbose, file, z=gzip, j=bzip2, J=xz.

Ключ Значение
c / x / t создать / извлечь / показать список
f FILE имя архива (всегда последним в группе)
v подробно (список файлов)
z / j / J gzip / bzip2 / xz
-C DIR сменить каталог (куда извлекать / откуда паковать)
--exclude=PAT исключить по шаблону
-p сохранить права (для root по умолч.)
--strip-components=N срезать N верхних каталогов при извлечении
-a выбрать сжатие по расширению f автоматически
# создать
tar czf backup.tar.gz /etc                 # упаковать /etc с gzip
tar cJf backup.tar.xz dir                  # с xz (сильнее, медленнее)
tar czf b.tar.gz -C /var/www site          # запаковать site, лежа в /var/www (без /var/www/ в путях)
tar czf b.tar.gz --exclude='*.log' --exclude='cache' dir

# распаковать
tar xzf backup.tar.gz                      # извлечь сюда
tar xzf backup.tar.gz -C /restore          # извлечь в каталог
tar xzf b.tar.gz --strip-components=1       # срезать верхний каталог (частый кейс с релизами)
tar xzf backup.tar.gz etc/hosts            # извлечь один файл

# посмотреть/проверить (не распаковывая)
tar tzf backup.tar.gz | head               # список
tar tvzf backup.tar.gz                     # с правами/размерами/датами

# по сети (без промежуточного файла):
tar cz dir | ssh host 'tar xz -C /dest'    # переслать дерево на хост (см. ssh-client)

tar: Removing leading '/'

Норма: tar хранит относительные пути (чтобы не перезаписать систему при распаковке). Распаковывай в нужный каталог через -C.

Распаковал и засыпал текущий каталог («tar-бомба»)

Архив без верхнего каталога. Сперва смотри tar tzf a.tar.gz | head; распаковывай в отдельный -C /tmp/x. Лишний верхний каталог убирает --strip-components=1.

Permission denied / потерялись владельцы

Системные бэкапы распаковывай под root и с -p (права) / --same-owner (владельцы, у root по умолчанию).

Очень медленно / большой архив

xz (J) жмёт сильнее, но медленно; gzip (z) — баланс; для многоядерных — pigz (tar -c dir | pigz > a.tgz). Для инкрементов лучше rsync.

Не перезаписывать существующее при извлечении

--keep-old-files (ошибка, если есть) или --skip-old-files (пропустить).

tar czf a.tar.gz dir              # создать (gzip)
tar czf a.tar.gz -C /base sub     # без лишних верхних каталогов
tar xzf a.tar.gz -C /dest         # распаковать в каталог
tar xzf a.tar.gz --strip-components=1
tar tvzf a.tar.gz                 # посмотреть содержимое
# c=create x=extract t=list  z=gzip J=xz  v=verbose f=file  -C каталог

См. также