我目前在 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
选项意味着取消引用符号链接,即包含链接指向的文件或目录,而不是简单地记录存在符号链接以及它指向的内容的事实。