创建所有文件和目录的校验和 sha256?

Mar*_*noM 8 command-line files checksums

我需要创建一个目录中文件的校验和列表,包括任何子目录。

我尝试执行的命令如下:

 sha256sum -b * 

用法:

 -b = 以二进制读取。

 * = 指定您必须验证所有文件扩展名。

使用命令我得到以下输出:

sha256sum: test0: 是一个目录 e3d748fdf10adca15c96d77a38aa0447fa87af9c297cb0b75e314cc313367daf *test1.txt db0c7a354881fe2dd1b45881fe2dd1b48f7640f17f27f27fc7f27fc7fc70e25c7fc7f25c297a1b6567f270a18888877f297d

您还应该生成内容的校验和,而不是报告 test0 是一个目录。

您是否建议始终-b在任何类型的文件中使用?在什么情况下应该-t使用?

是否可以过滤我想在验证中省略的文件类型,而不必添加我想承认的所有文件?我应该执行什么命令?

我寻求帮助,但没有找到任何相关信息。

sud*_*dus 14

您可以使用find查找目录树中的所有文件,并让它运行sha256sum。以下命令行将为当前目录及其子目录中的文件创建校验和。

find . -type f -exec sha256sum {} \;
Run Code Online (Sandbox Code Playgroud)

我不使用选项-b-t,但如果你愿意,你可以使用-b所有文件。我注意到的唯一区别是每个文件名前面的星号。


use*_*501 14

长话短说

cd /path/to/working/directory
sha256sum <(find . -type f -exec sha256sum {} \; | sort)
Run Code Online (Sandbox Code Playgroud)

介绍

find对上述问题的更完整的答案,它解决了在不同系统上以不同顺序“查找”文件的问题。

通过管道输出到文件,与diff

首先,您可能希望将输出通过管道传输到文件以便与 d​​iff 进行比较。为此,您将使用

find . -type f -exec sha256sum {} \; > file1.lst
Run Code Online (Sandbox Code Playgroud)

然后在你的其他系统上

find . -type f -exec sha256sum {} \; > file2.lst
rsync file2.lst user@host:/home/user/file2.lst
ssh user@host
diff file1.lst file2.lst # might not match due to order
Run Code Online (Sandbox Code Playgroud)

find通过管道修复找到的文件顺序sort

在这里,我假设您正在执行类似于我所要求的操作 - 通过网络将文件从一个系统复制到另一个系统并验证这些文件的完整性。

我发现,find两个系统之间查找文件的顺序可能有所不同,即使两种情况下的操作系统都是“Debian”。

因此,需要对文本文件中的输出进行排序。

sort file1.lst > file1sorted.lst
sort file2.lst > file2sorted.lst
diff file1.lst file2.lst # bad
diff file1sorted.lst file2sorted.lst # ok
Run Code Online (Sandbox Code Playgroud)

您可以在一行中完成所有find操作sort,同时将输出重定向到文件。

find . -type f -exec sha256sum {} \; | sort > file1.lst
Run Code Online (Sandbox Code Playgroud)

其他 sha/md5 和

您可能希望提高 shasumming 的级别。要使用 512 位版本,只需执行以下操作:

find . -type f -exec sha512sum {} \; | sort > file1.lst
Run Code Online (Sandbox Code Playgroud)

或者,256 位对于您正在做的事情来说可能有点过分了,所以就这样做

find . -type f -exec md5sum {} \; | sort > file1.lst
Run Code Online (Sandbox Code Playgroud)

一个完整的 1 行命令,用于比较 2 个目录和 1 个 shasum 输出

现在,如果您有很多文件并且不想将输出保存到文件中,您可以简单地对输出进行 shasum 操作。为此,请使用

sha256sum <(find . -type -f -exec sha256sum {} \; | sort)
Run Code Online (Sandbox Code Playgroud)

需要使用管道 tosort确保在计算最终 之前对输出进行排序sha256sum。如果没有这个,如果find找到不同顺序的文件,尽管每个文件的 shasum 是正确的,但整体 shasum 将取决于顺序。

与 diff 输出和使用的路径相关的问题

你可能有一些看起来像这样的路径

/A/B/C/*
Run Code Online (Sandbox Code Playgroud)

其中 * 是您对 shasum 感兴趣的子目录和文件。如果A/B/C1 个或多个目录仅包含 1 个子文件夹,您可能最终会意外地在错误的目录中运行 shasum 命令,从而导致以下结果

sort1.txt
sha256sum1    ./A/B/C/file1

sort2.txt
sha256sum2    ./B/C/file1
Run Code Online (Sandbox Code Playgroud)

即使sha256sum= sha256sum2diff 也会说文件不同。(因为它们是由于路径中的基目录不同所致。)

这是一个简短的 python3 代码,用于逐行检查总和,它解决了这个问题。

#!/usr/bin/env python3
file1_name = "sort1.txt"
file2_name = "sort2.txt"
file1 = open(file1_name, 'r')
file2 = open(file2_name, 'r')
file1_lines = file1.readlines();
file2_lines = file2.readlines();
if(len(file1_lines) == len(file2_lines)):
    print("line numbers ok")
    for i in range(len(file1_lines)):
        line1 = file1_lines[i]
        line2 = file2_lines[i]
        line1_split = line1.split(' ')
        line2_split = line2.split(' ')
        shasum1 = line1_split[0]
        shasum2 = line2_split[0]
        if(shasum1 != shasum2):
            print("shasum error: ", line1)
else:
    print("Error: file ", file1_name, " number of lines != ", file2_name, " number of lines")
print("done")
Run Code Online (Sandbox Code Playgroud)

我最初想编写一个 shell 脚本来做到这一点,但我厌倦了尝试弄清楚如何做到这一点,所以又回到了 python。

这让我认为,除了 find 命令之外,实际上编写 python 代码来完成整个事情会更容易。


小智 8

迟到的答案,但为了文档......

其他答案建议sha256sum通过find-exec选项致电。这具有为每个文件调用一次的效果sha256sum,这对于操作系统来说是很大的开销。

更有效的解决方案是find通过管道将结果转换为命令行参数xargssha256sum以这种方式调用。xargs如果行太多,则运行sha256sum一次或大批量运行。

find /path/to/your/dir -type f | xargs sha256sum -b
Run Code Online (Sandbox Code Playgroud)

如果文件名带有空格,请使用-print0flag infind-0flag inxargs来终止字符串\0

find /path/to/your/dir -type f -print0 | xargs -0 sha256sum -b
Run Code Online (Sandbox Code Playgroud)