LINUX.ORG.RU
решено ФорумAdmin

gnutar vs bsdtar exclude

 ,


0

1

Проблема c bsdtar исключения шаблонов.

debian 10:

# tar --version
tar (GNU tar) 1.30
# tar -cpzvvf - --totals --exclude='/dev/*' /dev > rrrr.tgz
tar: Удаляется начальный `/' из имен объектов
drwxr-xr-x root/root         0 2020-06-24 07:13 /dev/
Всего записано байт: 10240 (10KiB, 7,2MiB/s)
# tar -ztf rrrr.tgz
dev/
# 
Код выше. Все в порядке, в исключение попало содержимое папки, но сама папка осталась.

freebsd 10:

# tar --version
bsdtar 3.1.2 - libarchive 3.1.2
# tar -cpzvvf - --totals --exclude='/dev/*' /dev > rrrr.tgz
Total bytes written: 29
# tar -ztf rrrr.tgz
# 
Bsdtar исключил как содержимое так и саму папку.

Вопрос:
Как сделать чтоб папка осталась, а содержимое пошло в исключение?



Последнее исправление: kozanostra (всего исправлений: 2)

Как сделать чтоб папка осталась, а содержимое пошло в исключение?

 % uname -srm
FreeBSD 12.1-RELEASE-p3 amd64
 % tar --version
bsdtar 3.4.0 - libarchive 3.4.0 zlib/1.2.11 liblzma/5.2.4 bz2lib/1.0.8 
testdir
└─ 1
   ├─ 1.f
   └─ 2.f

 % tar -cpzvvf - --totals --exclude='1/*.f' 1/ >test.tgz
a drwxr-x---  2 mord0d mord0d      4 Jun 24 12:32 1
Total bytes written: 93

То есть маска должна быть не dir/*, а dir/something*, dir/*something, dir/*something* или dir/some*thing, тогда прокатит.

Ещё можно извратиться с find(1) или ls(1) и пайпнуть их выхлоп в tar(1).

tar — tape archive, его задача — архивировать данные, а не inode, тем более не содержащие данных (в GNU решили иначе, но BSD tar ведёт себя как вёл всегда).

mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)
Ответ на: комментарий от kozanostra

Он предлагал использовать --one-file-system вместо --exclude.

Такое прокатит с /dev, по крайней мере в FreeBSD:

 % mount -t devfs
devfs on /dev (devfs, local, multilabel)
mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Если топикстартер пишет какую-то скриптоту, то всё равно понадобится какой-нибудь fallback. А устанавливать пакеты из скриптоты — не очень хорошая идея.

mord0d ★★★★★
()

Ещё у bsdtar есть опция -n/--norecurse/--no-recursion:

 % tar -cpzvvf - --totals -n 1/ >test.tgz
a drwxr-x---  2 mord0d mord0d      4 Jun 24 12:32 1
mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)

Попробуй --exclude='/dev/?*'

legolegs ★★★★★
()
Ответ на: комментарий от anc

Честно говоря, сам регулярно забываю про эту опцию. ☺

Ну и да, оно бесполезно при необходимости исключить содержимое конкретных директорий, не исключая все.

mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)
Ответ на: комментарий от mord0d

Тут уже можно комбинировать (скриптовать), но в части задачи ТС Ваш ответ подходит на все 100%.
ЗЫ Я тоже об этом забываю регулярно :) Привык к gnu tar и каждый раз вспоминаю как оно там в bsd (точнее «подсматриваю» в старых скриптах) :)

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от anc

Привык к gnu tar и каждый раз вспоминаю как оно там в bsd (точнее «подсматриваю» в старых скриптах) :)

 % uname -srm
FreeBSD 12.1-RELEASE-p3 amd64

Я тоже об этом забываю регулярно :)

Я забываю больше по причине того, что “do one thing and do it well”, и пайпаю листинги из find в tar. В особо упоротых хитрых случаях и GNU tar потребует подобных телодвижений.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Та не, тут верно, ну обычным таром заархивировать систему и перенести. Ну лень же потом создавать тот же /dev. :)

anc ★★★★★
()
Ответ на: комментарий от anc

ну обычным таром заархивировать систему и перенести

Не знаю как другие *BSD, но FreeBSD в таком не нуждается. Тут максимум что надо архивировать — /etc, /usr/local/etc и пользовательское (хомяк и прочее, но это можно изначально разместить на другом разделе/диске и не напрягаться). Установки FreeBSD сводится к распаковыванию пары архивов (kernel.txz и base.txz, на amd64 по желанию lib32.txz), останется только конфиги развернуть, обновить базовую систему бинарными патчами и установить пакеты/порты.

А в Linux — да, с этим имеются некоторые… сложности. Я ведь уже упоминал про костыли, требующие ещё большие костыли, чтобы ничего не развалилось? ☺ Это, кажется, было в контексте Ubuntu, но всё же. ☺

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Я немного не о том писал. Вы говорите от том как накатить конфиги на «рабочую систему». Я же писал про вариант «чистый диск» на который залили/распоковали архив.

anc ★★★★★
()
Ответ на: комментарий от anc

Вы говорите от том как накатить конфиги на «рабочую систему».

Или на свежеустановленную.

Разница в том, что в *BSD есть базовая система и есть порты/пакеты, они между собой не смешиваются; Linux-дистрибутив состоит исключительно из пакетов, он не имеет монолитной базовой системы, такой подход не может гарантировать консистентность из-за возможных сторонних репозиториев, которые могут заменять в том числе системно-важные пакеты. Я не утверждаю что это проблема, но эту особенность нужно всегда иметь в виду.

Я же писал про вариант «чистый диск» на который залили/распоковали архив.

Поэтому я упомянул следующее:

Установки FreeBSD сводится к распаковыванию пары архивов (kernel.txz и base.txz, на amd64 по желанию lib32.txz)

То есть установка базовой системы, консистентной на момент времени (патчлевел). Конечно, этот способ не подходит тем, кто не знаком с устройством системы (ибо boot0 в таком случае придётся ставить в bootsector/ESP руками), но всё же. Даже после автоматической установки (которая лишь немного дольше из-за небольшого количества интерактива) можно будет развернуть архивы с конфигами.

И исходя из консистентности базовой системы на момент времени, следует вывод, что архивировать её не имеет смысла. ☺

mord0d ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.