GNU tar的"././@LongLink"技巧到底是什么?

20

我读到 gnu tar 和兼容的 tar 工具中使用 "L" (76)作为 tar 条目类型,以指示存档中下一个条目有一个“长”的名称。在这种情况下,类型为'L'的头块通常编码名称为././@LongLink。

我的问题是:下一个块的格式在哪里描述?

tar 存档的格式非常简单:它只是一系列 512 字节块。在正常情况下,tar 存档中的每个文件表示为一系列块。第一个块是头块,包含文件名、条目类型、修改时间和其他元数据。然后是原始文件数据,使用所需的 512 字节块数量。然后是下一个条目。

如果文件名长于头块中分配的空间,则 gnu tar 显然使用称为“././@LongLink 技巧”的方法。我找不到准确的描述。

当条目类型为 'L' 时,如何知道“长”文件名有多长?长名称是否限制为 512 字节,换句话说,任何适合一个块的大小?

最重要的是:这在哪里记录?


8
有人投票将此关闭为与编程无关。实际上,它与编程有关,因为我正在尝试在.NET中构建一个支持GNU的LongName技巧的tar文件。如果我只需要提取存档,我当然可以使用gnu的tar,我也不需要这个问题的答案。 - Cheeso
2个回答

15

观察单个tar档案中,我对'L'类型的条目和"././@LongLink"名称做出以下推测:

'L'类型的条目出现在一个头部中,该头部包含1个或多个512字节块,仅用于存储文件名或目录名,当文件名或目录名超过100个字符时使用。例如,如果文件名为1200个字符,则头部块中的大小将为1200,并且还将有3个附加的文件名数据块;最后一个块是部分填充的。

在该系列后面是另一个传统形式的头部块 - 带有类型为'0'(常规文件)或'5'(目录)的头部,以及相应数量的数据块与条目数据。在这个系列的头部中,名称将被截断为实际名称的前100个字符。

编辑
可以在此处查看我的实现: http://cheesoexamples.codeplex.com/SourceControl/changeset/view/99885#1868643


1
我还找到了这个页面,它更详细地讲解了"LongLink": http://www.delorie.com/gnu/docs/tar/tar_114.html你也可能会遇到"@ @MaNgLeD.*"头部。这些与LongLink类似,但数据块中包含一个脚本,用于将文件从"@MaNgLeD.___"重命名为其真实路径名。当你自己处理TAR文件时,可以非常类似地处理它们。 - Daryl Hanson
1
从我所看到的,大小为strlen() + 1,因此在您的示例中,tar文件中的大小将为1201。尽管如果您的文件名恰好是512字节的倍数,除非您不保存NUL终止符,否则可能并不重要。 - Alexis Wilke
@AlexisWilke - 已经过去了几年,但我记得空字符没有被编码。不过你可能是对的。 - Cheeso
请参阅此有用的手册页面:'L'表示长文件名。Star能够读取和写入此类型的头文件。对于xustar和exustar格式,star更喜欢使用POSIX.1-2001方法存储长文件名。大小始终为非零,并表示包括尾随空字节在内的长文件名的长度。文件名在跟随标题的数据中。 - xroche

4
注意,所有相关信息都可以在libtar项目中找到:

http://www.feep.net/libtar/

建议使用的头文件是libtar.h(与POSIX的tar.h相反),它明确包含了长文件名和长符号链接。
获取长文件名/链接的“虚假”头文件和数据,然后获取“真实”的头文件(除了实际文件名和符号链接)。
HEADER type 'L'
BLOCKS of data with the real long filename
HEADER type 'K'
BLOCKS of data with the real symbolic link
HEADER type '0' (or '5' for directory, etc.)
BLOCKS of data with the actual file contents

当然,在 MS-Windows 下,你可能无法处理符号链接,尽管 Win7 中据说符号链接在 MS-Windows 下已经可以使用了(终于——现在在 Win10 中也是官方支持的!)
来自 libtar.h 的相关定义:
/* GNU extensions for typeflag */
#define GNU_LONGNAME_TYPE   'L'
#define GNU_LONGLINK_TYPE   'K'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接