我正在尝试在 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
。