Cygwin 在 tar 内部创建了多个文件链接?

Cygwin 在 tar 内部创建了多个文件链接?

我正在尝试在 Cygwin 中创建一个 .tar 文件:

find . > tmpfilelist
tar -cf tmp.tar -T tmpfilelist

但当我打开临时文件在装有 7-Zip 的 Windows 中,每个文件有 4 个实例:

Name              Size            Link
.gitignore        62
.gitignore        0               path/to/.gitignore
.gitignore        0               path/to/.gitignore
.gitignore        0               path/to/.gitignore

当我将 tar 解压到其自己的文件夹中时,系统提示我覆盖每个文件三次。此外,在资源管理器中查看解压文件夹的属性时,显示大小为 0 字节。

是否可以在 Cygwin 中创建一个可以在 Windows 中运行的 .tar 文件?澄清一下,我只使用.gitignore文件作为示例;该问题似乎与所有文件都有关。

编辑:

$ tar -tvf tmp.tar | grep -i "link to" | grep -i ".gitignore" | sort | head -n20
hrw-r--r-- user/None        0 2011-07-06 11:27 path/to/.gitignore link to path/to/.gitignore
hrw-r--r-- user/None        0 2011-07-06 11:27 path/to/.gitignore link to path/to/.gitignore
hrw-r--r-- user/None        0 2011-07-06 11:27 path/to/.gitignore link to path/to/.gitignore
hrw-r--r-- user/None        0 2011-09-29 15:40 path/to/other/.gitignore link to path/to/other/.gitignore
hrw-r--r-- user/None        0 2011-09-29 15:40 path/to/other/.gitignore link to path/to/other/.gitignore
hrw-r--r-- user/None        0 2011-09-29 15:40 path/to/other/.gitignore link to path/to/other/.gitignore
...

$ grep -i ".gitignore" tmpfilelist | sort | head -n20
path/to/.gitignore
path/to/other/.gitignore
...

Cygwintar显示的是相同的列表,但是临时文件列表似乎没有这些额外的链接。所以我想真正的问题是如何在 Cygwin 中制作格式良好的 tar 文件?我不确定它们是否相关或如何应用和tar选项。--dereference--hard-dereference

编辑:据我所知,7z当给定一个文件列表而没有指定根目录时,不会保留目录结构,并且列表中某些文件没有公共根目录(该列表最终将被聚合以供多次find执行)。

答案1

一个问题可能是find . > tmpfilelist列出文件和目录。

tar解析tmpfilelist并将任何列出的目录添加到 tar 文件及其内容

tar还添加了列出的任何文件tmpfilelist,但这些文件已经添加处理目录时tar。结果是文件被包含多次(如果文件位于目录结构的深处,则最终包含多次)。

你应该使用:

find . ! -type d > tmpfilelist

生成除目录之外的文件系统对象列表。

至于您提到的符号链接,它们最终如何成为 tar 文件的一部分对我来说是一个谜。

编辑:符号链接可能已经存在。使用 列出它们find . -type l

相关内容