find 的管道输出到 tar:避免重复链接到存档中的文件

find 的管道输出到 tar:避免重复链接到存档中的文件

find当通过管道传输to的输出时tar,每个文件的两个链接会出现在生成的存档中。如果tar直接应用于目录则不是这种情况。可以避免重复链接吗?

这是一个例子:

$ mkdir tmp
$ for i in {1..3}; do echo "$i" > "tmp/$i"; done
$ ls tmp
1  2  3
$ tar -cvvf tmp.tar tmp | sort
drwxr-xr-x usr/grp   0 2019-05-02 15:09 tmp/
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/1
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/2
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/3
$ find tmp | tar -T - -cvvf tmp.tar | sort
drwxr-xr-x usr/grp   0 2019-05-02 15:09 tmp/
hrw-r--r-- usr/grp   0 2019-05-02 15:09 tmp/1 link to tmp/1
hrw-r--r-- usr/grp   0 2019-05-02 15:09 tmp/2 link to tmp/2
hrw-r--r-- usr/grp   0 2019-05-02 15:09 tmp/3 link to tmp/3
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/1
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/2
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/3

这是使用 GNU tar 1.26 完成的。

答案1

正如 Steeldriver 所指出的,问题在于tar不仅接收了目录中的文件,还接收了目录本身。默认行为tar是通过目录递归,因此目录中的每个条目都会被第二次添加(一次通过显式提供文件,一次通过显式提供的目录递归)。解决方案是 (1) 不提供目录或 (2) 禁用递归。

第一个看起来像:

$ find tmp -type f -print0 | sort -z | tar --null -T - -cvvf tmp.tar
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/1
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/2
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/3

第二种情况(我需要它,因为我想重现完整的嵌套目录结构)是简单地禁用递归:

$ find tmp -print0 | sort -z | tar --no-recursion --null -T - -cvvf tmp.tar
drwxr-xr-x usr/grp     0 2019-05-02 17:06 tmp/
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/1
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/2
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/3

相关内容