Как указать другое имя «верхнего уровня» для tar?

10

Я хотел бы использовать tar-root (/) и позволить ему отображаться как / abc в архиве tar.

Существует ли флаг tar для указания пользовательского имени верхнего уровня?

Хауард
источник

Ответы:

6

Самый близкий, который я могу найти, является --transformвыбором. Я не знаю точно, но я предполагаю, что это флаг только для GNU:

 --transform, --xform EXPRESSION
       use sed replace EXPRESSION to transform file names

С помощью этого, вы можете передать sedкоманду подстановки и изменить /на /abc:

tar cf root.tgz --transform 's/^\//\/abc/' /

Это все равно будет печатать /пути при создании архива, но они станут, /abcкогда вы его распакуете.


Другой подход, если у вас tarнет --transformвыбора, это сделать /abcсимволическую ссылку, указывающую на, /а затем выполнить tar:

$ ln -s / /abc
$ tar chf root.tgz /abc

Это -hважно, так как это то, что говорит tarпо ссылкам:

 -h, --dereference
       follow symlinks; archive and dump the files they point to

Это будет иметь эффект установки /abcв качестве каталога верхнего уровня.

Тердон
источник
2

С GNU tar вы можете использовать эту команду:

tar --transform="s|/|/abc/|" -Pcf bar.tar /

В противном случае, есть переносимый способ сделать это, то есть тот, который не зависит от GNU или другого конкретного расширения tar, но основан на инструменте POSIX, который должен быть доступен на любой Unix-совместимой машине:

pax -w -s '/\//\/abc\//' -f foo.tar /
jlliagre
источник
1

Вот как я это сделал, который работает для получения звонков из любого места (не только /):

tar --transform 's|^|/abc/|' -zcvf /path/to/dest.tgz *

Он просто добавляет /abc/к началу каждого пути.

Зейн Хупер
источник
1
При извлечении архива, созданного таким образом, я получаю предупреждение tar: Removing leading / from member names. Использование 's|^|abc/|'работало хорошо для меня.
Майкл Платингс