制作 tar 时将文件放入子目录中

制作 tar 时将文件放入子目录中

我正在尝试制作一个 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/

相关内容