如何递归列出目录及其子目录中所有文件的Md5sum?

我想要列出(并保存)一个目录中所有文件的MD5校验和,并将该列表保存在名为md5sum.txt的文本文件中。
如果我能够:
- 将其集成到tree命令中(该命令可以创建文件夹和文件的树形结构) - 使其适用于文件夹和子文件夹(这很重要)
那就太好了。

有关每个子文件夹的单独校验和文件,请参阅此答案 - mivk
2个回答

你可以使用(在目录中)find
find -type f -exec md5sum '{}' \; > md5sum.txt

如果你想排除掉 md5sum.txt 文件本身,可以这样做:
find -type f \( -not -name "md5sum.txt" \) -exec md5sum '{}' \; > md5sum.txt

你还可以使用循环:打开递归通配符。
shopt -s globstar

然后,在目录中:
for i in **; do [[ -f "$i" ]] && md5sum "$i" >> md5sum.txt; done

你也可以将文件本身从这个中排除掉。
for i in **; do 
  [[ -f "$i" ]] && 
  [[ md5sum.txt != "$i" ]] && 
  md5sum "$i" >> md5sum.txt
done

这两个都不会生成类似于“树”结构的结果。但它们会打印出文件相对于起始目录的路径。如果你想要绝对路径,请使用find /path/to/directory ... 之后你可能想要关闭globstar(shopt -u globstar

1这也会创建md5sum.txt文件本身的MD5校验和。如果它不这样就好了。 - Anwar
2@Anwar,请查看编辑部分,稍微繁琐的排除方式 ^_^ - Zanna
1啊!看到了。我宁愿在一个巨大的md5sum.txt文件中使用一行代码,也不愿意用多余的5行代码。无论如何,这样做更好。 - Anwar
3可以始终执行命令:"> ../md5sum.txt" 以确保该文件不会被包含在结果中。 - user1985553
对于二进制文件,请不要忘记在md5sum命令后添加-b选项。 - Roland Pihlakas
如果你想在输出中连续显示文件名,可以使用sort -k2 -o md5sum.txt md5sum.txt命令。 - n0099

您可以执行以下命令:
md5sum /path/to/directory/* > /path_to_result/md5sum.txt

在结果文件中的输出将是这样的:
46684e3891d990acde2e723ee3d4e94a  /var/log/alternatives.log
39cf1ebf93452ed5f8b240b35ae73f9f  /var/log/alternatives.log.1
aa6c09c411d1d0870bca5f401d589332  /var/log/alternatives.log.2.gz

3如果存在一个目录,就无法工作。会显示md5sum: /path_to_dir: 是一个目录 - Anwar
@Anwar 运行 md5sum /path_to_dir/* 将会对目录中的每个文件执行 md5sum 命令。 - Yaron
1子目录中的其他文件呢? - Anwar
1@Anwar - 它在子目录上不起作用(这被定义为问题中的“好要有”)。 - Yaron
1但我看到这被添加到版本中,这是相当重要的 - Anwar
这根本没有回答问题。 - ABCD
这完全错了。 - george