在 tar 中添加前缀

在 tar 中添加前缀

我目前在 shellscript 中执行的操作非常低效:

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

我希望所有内容都包含在名为 $VERSION 的目录中 - 有没有办法做到这一点而不必像上面的脚本那样复制所有内容?

答案1

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

答案2

要 tar 当前目录并添加前缀,这对我有用:

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

答案3

要舒适地添加目录前缀,请使用与参数不同的分隔符/--transform例如+,像Andy的答案中那样。

因此,对于更简单的情况,您在当前目录中有一堆文件,并且您不想创建一个焦油炸弹

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

语法是s+search+replace+,它^只是匹配文件名的开头。

现在,只需回答 OP - 好吧,你可以/tmp通过运行以下命令来避免复制整个目录:

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

或者:

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

(硬链接,避免符号链接的问题)

最后两个是为了娱乐价值而包含的,我自己会坚持 toro2k 的回答。

答案4

如果你可以不保留你正在 tar 的文件树中的符号链接,你可以这样做

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

h选项意味着取消引用符号链接,即包含链接指向的文件或目录,而不是简单地记录存在符号链接以及它指向的内容的事实。

相关内容