为什么 md5sum 在查找名称中带有“\”的文件的校验和时在校验和前面添加“\”?
$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e /tmp/test\\test
对于所有其他实用程序来说也是如此。
答案1
这是记录在案,对于 Coreutils' md5sum
:
如果文件包含反斜杠或换行符,该行以反斜杠开头,文件名中的每个有问题的字符都用反斜杠转义,即使存在任意文件名,输出也不会产生歧义。
(文件是文件名,而不是文件内容)。
b2sum
,sha1sum
,以及各种SHA-2 工具行为方式与 相同md5sum
。sum
和cksum
不;sum
仅提供向后兼容性(并且其祖先不产生带引号的输出),并且cksum
是由 POSIX 指定并且不允许这种类型的输出。
这种行为是2015年11月推出并在版本8.25(2016年1月)中发布,条目如下NEWS
:
md5sum
现在,通过在行开头使用 '\' 并用 '\n' 替换任何换行符,确保每个文件在标准输出上显示状态。这也会影响sha1sum
、sha224sum
、sha256sum
和sha384sum
。sha512sum
行开头的反斜杠用作标志:仅当行以反斜杠开头时才会处理文件名中的转义。 (取消转义不能是默认行为:它会破坏旧版本的 Coreutils 包含\\
或\n
存储在存储的文件名中生成的总和。)
答案2
斯蒂芬·基特的回答涵盖了什么我会尽力涵盖为什么此更改已实施。首先,有人观察到包含换行符1 的文件名可能会导致不明确的输出。例如,考虑以下输出:
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
这是否意味着有两个文件foo
和bar
,或者只有一个文件名为"foo\n25af89c92254a806b2e93fffd8ac1814 bar"
?诚然,后一种可能性极不可能,但也是有可能的。为了解决歧义,开发人员选择使用反斜杠 ( \
) 转义换行符。然后输出就变得可区分。然而,还有一个更模糊的地方:
764efa883dda1e11db47671c4a3bbd9e foo\nbar
该文件的名称是否包含换行符或反斜杠后跟n
?为了解决这个问题,我们还需要转义反斜杠,这样后一种情况就变成了:
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
最后,他们选择在包含此类转义符的每个输出行前面加上 a ,\\
以便于解析器检测是否已完成转义。据推测,这样做是为了允许解析器处理来自转义版本md5sum
和非转义版本(非 GNU)的输出。该标志还意味着在不必要时不需要进行“昂贵的”取消转义。您可以在以下位置查看此解析的示例:md5sum.c
本身(链接版本中的第 382 行)。
1由新队我的意思\n
是有时也被专门称为换行或者如果;看md5sum.c
。