Додайте префікс у тар


17

Наразі я робимо в оболонці дуже неефективно:

cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION

Я хочу, щоб все містилося в каталозі під назвою $ VERSION - чи є спосіб це зробити без копіювання всього, як у вищевказаному сценарії?


Навіщо копіювати його в першу чергу? Чому ні tar cjf archive.tar.bz2 $MYPATH?
Чеві

2
@Chewie сказав, що він хоче версію $ в якості батьківського реєстру в архіві.
Кент

О, я це зараз бачу.
Чеві

Відповіді:


26

Версія GNU tarпідтримує --transformопцію (та її псевдонім --xform), ви можете використовувати її так

tar --transform "s/^$MYPATH/$VERSION/" -cf archive.tar.bz2 "$MYPATH"

Наприклад, з огляду на це дерево каталогів

foo
└── foo.txt

команда

tar --transform "s/^foo/bar/" -cf foo.tar.bz2 foo

створить такий архів

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt

3
Примітно, що такий підхід може порушити символічні зв’язки. Попереднє рішення flags=r;вирішує проблему, як згадується в stackoverflow.com/a/29661783/388803 .
ерегон

не включайте проділ; коли я поміщаю кінцеву косу рису в перетворенні, початковий префікс пропускається; наприклад s/^a\//b\//, tar -tдосі відображається, a/коли всі інші файли знаходяться під b/; Я припускаю, що це небезпечно, і мені дійсно не потрібно захищати від іншого файлу з тим самим префіксом, який не є каталогом у файлі tar; так що жодна косою косою рисою не є нормальною, я б не заперечував, щоб знати найкращий спосіб впоратися з випадком a/трансформації, але не aa/якби це був побратим кореневого вузла.
ThorSummoner

15

Щоб орієнтуватися на поточний каталог і додати префікс, це працювало для мене:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .

0

Якщо ви можете піти, не зберігаючи символічні посилання в дереві файлів, на яке ви орієнтуєтесь, ви можете зробити це

ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION

Цей hпараметр означає перенаправлення символів, тобто включає файл або каталог, на який посилання вказує, а не просто записує на те, що було симпосилання та на що воно вказувало.


0

Щоб зручно додати префікс каталогу, використовуйте інший роздільник, ніж /у --transformаргументі, наприклад, +або ,як у відповіді Енді.

Отже, для більш простого випадку у вас є маса файлів у поточному каталозі, і ви не хочете створювати tarbomb .

tar czf logs_nightly.tar.gz --tranform 's+^+logs_nightly/+' *.log

Синтаксис є s+search+replace+, і ^він просто відповідає початку імені файлу.

А тепер, щоб відповісти на ОП - добре, ви можете уникнути копіювання всього каталогу /tmp, запустивши:

mv $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION
mv $VERSION $MYPATH

Як варіант:

ln $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION

(жорстке посилання, уникає проблем із посиланнями)

Останні два були включені для розважальної цінності, я сам би дотримувався відповіді toro2k.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.