我正在尝试制作一个 tar 文件。我有 2 个文件夹需要 tar。让我澄清我的问题。
folder 1. /temp1
folder 2. /temp1
现在我希望我的 tar 输出是这样的,当我解压它时我得到
/temp1/* (stuff of temp1)
/temp1/temp2/* (temp2 and subdirectories inside temp1).
现在我正在将 temp2 复制到 temp1 中,然后将其压缩。任何人都可以建议我以一种不必复制这些内容的方式来做,就好像我杀死中间的进程一样,我将在 temp1 中留下 temp2 的一些内容。
答案1
将 temp2 符号链接到 temp1,然后告诉 tar 使用-h
或--dereference
选项取消引用(跟随)该符号链接。
例如
cd temp1
ln -s ../temp2/ .
cd ..
tar cvz -h -f example.tar.gz ./temp1
rm -f temp1/temp2
这将在目录./temp2
下创建一个 tar 存档./temp1
(即./temp1/temp2
)
我不记得这个-h
选项是否是 GNU 扩展。如果您不使用 GNU tar
,请在使用前仔细测试。
如果您关心 temp1 的修改时间戳,请使用touch -r
:
touch -r temp1 temp1-modtime
cd temp1
ln -s ../temp2/ .
cd ..
touch -r temp1-modtime temp1
tar cvz -h -f example.tar.gz ./temp1
rm -f temp1/temp2
touch -r temp1-modtime temp1
rm -f temp1-modtime
答案2
您可以使用 tar 的转换选项来完成此操作,该选项会在将路径名处理到存档中时对路径名进行 sed 查找和替换。
我想你想要的是:
tar -cf output.tar --transform 's,^temp2,temp1/temp2,' temp1 temp2
这将匹配任何以 开头的路径temp2
并将它们重写为temp1/temp2
.它不会匹配,因此不会修改任何以 开头的路径temp1
。
答案3
通过一些技巧使用 tar 附加功能。像这样的东西吗?
$ mkdir temp3; mkdir temp3/temp1 # create another, empty temp1 dir
$ ln temp2 temp3/temp1/temp2 # link temp2 into fake temp1
进而...
$ tar cf example.tar temp1 # 1st part of archive without temp2
$ cd temp3
$ tar rf ../example.tar temp1 # append temp2 as subfolder of temp1 to archive
使用硬链接可以使临时目录中的符号链接仍然被视为符号链接。所以不需要 -h 。或许能让你以后不再有麻烦。
您还可以结合append 命令查看GNU tar 扩展,例如--transform。也可以看看:http://www.linuxquestions.org/questions/linux-newbie-8/tar-subdirectory-question-821074/