В настоящее время я делаю в сценарии очень неэффективно:
cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION
Я хочу, чтобы все содержалось в каталоге с именем $ VERSION - есть ли способ сделать это без необходимости копировать все, как в приведенном выше сценарии?
tar cjf archive.tar.bz2 $MYPATH
?Ответы:
Версия GNU
tar
поддерживает--transform
опцию (и ее псевдоним--xform
), вы можете использовать ее следующим образомНапример, учитывая это дерево каталогов
команда
создаст архив как
источник
flags=r;
решение решает проблему, как указано в stackoverflow.com/a/29661783/388803 .s/^a\//b\//
,tar -t
все еще показывает, вa/
то время как все другие файлы находятся подb/
; Я предполагаю, что это опасно, и мне не нужно защищать от какого-либо другого файла с тем же префиксом, который не является каталогом в файле tar; так что никакой косой черты в порядке, я не возражаю, зная, как лучше всего справиться со случаемa/
трансформации, но не в томaa/
случае, если это был брат или сестра корневого узла.Чтобы сменить текущий каталог и добавить префикс, это сработало для меня:
источник
Если вы можете уйти без сохранения символических ссылок в файловом дереве, которое вы используете, вы можете сделать
В
h
средства опции разыменования символические ссылки, то есть включать в файл или каталог, ссылка указывает , а не просто записывает тот факт , что там была символическая и то , что он указал.источник
Для удобного добавления префикса каталога используйте другой разделитель, чем
/
в--transform
аргументе, например+
или,
как в ответе Энди.Итак, для более простого случая у вас есть куча файлов в текущем каталоге, и вы не хотите создавать tarbomb .
Синтаксис
s+search+replace+
, и для^
него просто совпадает с началом имени файла.А теперь, просто чтобы ответить на OP - вы можете избежать копирования всего каталога
/tmp
, выполнив:В качестве альтернативы:
(жесткая ссылка, избегает проблем с символическими ссылками)
Последние два были включены для развлекательной ценности, я сам придерживался ответа toro2k.
источник