目录的目录的 sha1sum

目录的目录的 sha1sum
sha1sum ./path/to/directory/* | sha1sum 

以上是发布作为计算包含文件的目录的 sha1sum 的方法。如果目录包含更多目录,此命令将失败。有没有一种方法可以普遍递归计算目录的 sha1sum(无需针对特定目录自定义算法)?

答案1

谢谢这篇文章

find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum

警告:此代码未经测试!如果此问题有误,请编辑它并修复它;我会批准您的编辑。

答案2

我通常喜欢这种find | xargs模式,就像这样:

find /path/to/directory -type f -print0 | xargs -0 sha1sum

您必须使用“-print0”和“-0”,以防文件名中有空格。

但这与find -exec cmd {} \;模式非常相似。

讨论https://stackoverflow.com/questions/896808

答案3

另一个技巧可能是使用 tar 对文件内容和元数据进行散列:

tar -cf - ./path/to/directory | sha1sum

答案4

更新:距离我发布这个回复已经有几年了,在此期间,我多次重写并改进了我在这里提出的脚本。我决定将新脚本重新发布为一个全新的答案。我强烈推荐这个。

介绍

我观察到 find 命令输出目录中找到的元素的顺序在不同分区上的相同目录中有所不同。如果您正在比较同一目录的哈希值,则不必担心这一点,但如果您获取哈希值以确保在复制过程中没有文件丢失或损坏,则需要添加一行额外的行来对目录及其元素的内容进行排序。例如,Matthew Bohnsack 的回答非常优雅:

find ./path/to/directory/ -type f -print0  | xargs -0 sha1sum

但是如果您使用它来比较复制的目录和原始目录,则需要将输出发送到 txt 文件,然后使用 Kompare 或 WinMerge 或简单地获取每个列表的哈希值,将其与另一个目录的输出列表进行比较。问题是,由于 find 工具输出内容的顺序可能因目录而异,因此 Kompare 会发出许多差异信号,因为哈希值的计算顺序不同。对于小目录来说这不是什么大问题,但如果您处理的是 30000 个文件,那就很烦人了。因此,您必须执行额外的步骤对输出进行排序,以便更轻松地比较两个目录之间的哈希列表。

find ./path/to/directory/ -type f -print0  | xargs -0 sha1sum > sha1sum_list_unsorted.txt
sort sha1sum_list_unsorted.txt > sha1sum_list_sorted.txt

这将对输出进行排序,以便在运行差异程序时,具有相同哈希值的文件将位于同一行上(前提是没有文件缺少新目录)。

然后进入脚本...

这是我编写的脚本。它的作用与 find/xarg 答案相同,但它会在获取 sha1sum 之前对文件进行排序(将它们保存在同一目录中)。脚本的第一行递归查找目录中的所有文件。下一行按字母顺序对结果进行排序。接下来的两行,获取排序后的内容,并将 sha1sum 和引号附加到排序列表中的文件,从而形成一个大型 shell 脚本,该脚本一次计算每个文件的哈希值并将其输出到 content_sha1sum.txt。

#!/bin/bash
find . -type f > content.txt
sort content.txt > content_sorted.txt
awk '{print "sha1sum \""$0}' content_sorted.txt > temp.txt
awk '{print $0"\""}' temp.txt > get_sha1.sh
chmod +x get_sha1.sh
./get_sha1.sh > content_sha1sum.txt
rm content.txt
rm content_sorted.txt
rm temp.txt
rm get_sha1.sh
xdg-open content_sha1sum.txt

希望这可以帮助。

相关内容