我需要创建目录内文件的校验和列表,包括任何子目录。
我尝试执行的命令如下:
sha256sum -b *
用法:
-b = 以二进制读取。 * = 指定您必须验证所有文件扩展名。
使用命令,我得到以下输出:
sha256sum: test0: 是目录 e3d748fdf10adca15c96d77a38aa0447fa87af9c297cb0b75e314cc313367daf *test1.txt db0c7a354881fe2dd1b45642a68f6a971c7421e8fdffe56ffa7c7420111*test1.txt
您还应该生成内容的校验和,而不是报告 test0 是一个目录。
您是否建议始终-b
在任何类型的文件中使用?应该在什么情况下-t
使用?
是否可以过滤我想要在验证中省略的文件类型,而不必添加我想要承认的所有文件?我应该执行什么命令?
我寻求帮助,但我没有找到任何相关的东西。
您可以使用
find
查找目录树中的所有文件,并让它运行sha256sum
。以下命令行将为当前目录及其子目录中的文件创建校验和。我不使用选项
-b
和-t
,但如果您愿意,可以-b
对所有文件使用。我注意到的唯一区别是每个文件名前面的星号。TL;博士
介绍
对上述问题的更完整答案,它解决了
find
在不同系统上以不同顺序“查找”文件的问题。管道输出到文件,比较
diff
首先,您可能希望将输出通过管道传输到文件以与 diff 进行比较。为此,您将使用
然后在您的其他系统上
修复
find
通过管道找到的文件的顺序sort
在这里,我假设您正在执行与我的要求类似的操作 - 通过网络将文件从一个系统复制到另一个系统并验证这些文件的完整性。
我发现
find
查找文件的顺序在两个系统之间可能会有所不同,即使在两种情况下操作系统都是“Debian”也是如此。因此,需要对文本文件中的输出进行排序。
您可以在一行中完成
find
所有操作sort
,同时将输出重定向到文件。其他 sha/md5 和
您可能希望提高 shasumming 的水平。要使用 512 位版本,只需这样做;
或者,256 位可能对你正在做的事情有点过分了,所以这样做
一个完整的 1 行命令,用于将 2 个目录与 1 个 shasum 输出进行比较
现在,如果您有很多文件并且不想将输出保存到文件中,您可以简单地对输出进行 shasum。为此,请使用
需要管道 to
sort
以确保在计算 final 之前对输出进行排序sha256sum
。如果没有这个,如果find
以不同的顺序找到文件,尽管每个文件的 shasum 都是正确的,但整体 shasum 将取决于顺序。与使用的差异输出和路径有关的问题
你可能有一些看起来像的路径
其中 * 是您对 shasumming 感兴趣的子目录和文件。如果
A/B/C
是 1 个或多个仅包含 1 个子文件夹的目录,您最终可能会意外在错误的目录中运行 shasum 命令,从而导致以下结果即使
sha256sum
=sha256sum2
diff 会说文件不同。(因为它们是由于路径中的不同基目录造成的。)这是一个简短的python3代码来逐行检查总和,它解决了这个问题。
我最初想编写一个 shell 脚本来做到这一点,但我厌倦了试图弄清楚如何去做,所以又回到了 python。
这让我觉得实际上编写一个 python 代码来完成整个事情会更容易,除了 find 命令。
迟到的答案,但为了记录......
其他答案建议
sha256sum
通过find
和-exec
选项调用。这具有sha256sum
为每个文件调用一次的效果,这对于操作系统启动进程来说是一个很大的开销。一个更有效的解决方案是
find
通过管道将结果转换为命令行参数xargs
并以这种方式调用sha256sum
。如果行太多,则xargs
运行一次或以大徽章运行。sha256sum
如果您的文件名带有空格,请使用
-print0
flag infind
和-0
flag inxargs
来终止字符串\0
要包含子目录中的所有文件,请使用双星号:
它需要启用 globbing。如果没有,请尝试启用它:
shopt -s globstar
. 有关更多详细信息,请参阅此问题。