md5sum 在校验和前添加“\”

md5sum 在校验和前添加“\”

为什么 md5sum 在查找名称中带有“\”的文件的校验和时在校验和前面添加“\”?

$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e  /tmp/test\\test

对于所有其他实用程序来说也是如此。

答案1

这是记录在案,对于 Coreutils' md5sum

如果文件包含反斜杠或换行符,该行以反斜杠开头,文件名中的每个有问题的字符都用反斜杠转义,即使存在任意文件名,输出也不会产生歧义。

文件是文件名,而不是文件内容)。

b2sum,sha1sum,以及各种SHA-2 工具行为方式与 相同md5sumsumcksum不;sum仅提供向后兼容性(并且其祖先不产生带引号的输出),并且cksum由 POSIX 指定并且不允许这种类型的输出。

这种行为是2015年11月推出并在版本8.25(2016年1月)中发布,条目如下NEWS

md5sum现在,通过在行开头使用 '\' 并用 '\n' 替换任何换行符,确保每个文件在标准输出上显示状态。这也会影响sha1sumsha224sumsha256sumsha384sumsha512sum

行开头的反斜杠用作标志:仅当行以反斜杠开头时才会处理文件名中的转义。 (取消转义不能是默认行为:它会破坏旧版本的 Coreutils 包含\\\n存储在存储的文件名中生成的总和。)

答案2

斯蒂芬·基特的回答涵盖了什么我会尽力涵盖为什么此更改已实施。首先,有人观察到包含换行符1 的文件名可能会导致不明确的输出。例如,考虑以下输出:

d41d8cd98f00b204e9800998ecf8427e  foo
25af89c92254a806b2e93fffd8ac1814  bar

这是否意味着有两个文件foobar,或者只有一个文件名为"foo\n25af89c92254a806b2e93fffd8ac1814 bar"?诚然,后一种可能性极不可能,但也是有可能的。为了解决歧义,开发人员选择使用反斜杠 ( \) 转义换行符。然后输出就变得可区分。然而,还有一个更模糊的地方:

764efa883dda1e11db47671c4a3bbd9e  foo\nbar

该文件的名称是否包含换行符或反斜杠后跟n?为了解决这个问题,我们还需要转义反斜杠,这样后一种情况就变成了:

764efa883dda1e11db47671c4a3bbd9e  foo\\nbar

最后,他们选择在包含此类转义符的每个输出行前面加上 a ,\\以便于解析器检测是否已完成转义。据推测,这样做是为了允许解析器处理来自转义版本md5sum和非转义版本(非 GNU)的输出。该标志还意味着在不必要时不需要进行“昂贵的”取消转义。您可以在以下位置查看此解析的示例:md5sum.c本身(链接版本中的第 382 行)。


1新队我的意思\n是有时也被专门称为换行或者如果;看md5sum.c

相关内容