AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1091335
Accepted
MarianoM
MarianoM
Asked: 2018-11-09 22:13:54 +0800 CST2018-11-09 22:13:54 +0800 CST 2018-11-09 22:13:54 +0800 CST

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

  • 772

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

我尝试执行的命令如下:

sha256sum -b *

用法:

 -b = 以二进制读取。

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

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

sha256sum: test0: 是目录 e3d748fdf10adca15c96d77a38aa0447fa87af9c297cb0b75e314cc313367daf *test1.txt db0c7a354881fe2dd1b45642a68f6a971c7421e8fdffe56ffa7c7420111*test1.txt

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

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

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

我寻求帮助,但我没有找到任何相关的东西。

command-line files checksums
  • 4 4 个回答
  • 37347 Views

4 个回答

  • Voted
  1. Best Answer
    sudodus
    2018-11-10T00:44:12+08:002018-11-10T00:44:12+08:00

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

    find . -type f -exec sha256sum {} \;
    

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

    • 26
  2. user3728501
    2020-09-05T02:43:02+08:002020-09-05T02:43:02+08:00

    TL;博士

    cd /path/to/working/directory
    sha256sum <(find . -type f -exec sha256sum \; | sort)
    

    介绍

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

    管道输出到文件,比较diff

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

    find . -type f -exec sha256sum {} \; > file1.lst
    

    然后在您的其他系统上

    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
    

    修复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
    

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

    find . -type f -exec sha256sum {} \; | sort > file1.lst
    

    其他 sha/md5 和

    您可能希望提高 shasumming 的水平。要使用 512 位版本,只需这样做;

    find . -type f -exec sha512sum {} \; | sort > file1.lst
    

    或者,256 位可能对你正在做的事情有点过分了,所以这样做

    find . -type f -exec md5sum {} \; | sort > file1.lst
    

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

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

    sha256sum <(find . -type -f -exec sha256sum \; | sort)
    

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

    与使用的差异输出和路径有关的问题

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

    /A/B/C/*
    

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

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

    即使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")
    

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

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

    • 8
  3. Bernd Gloss
    2021-03-15T23:03:25+08:002021-03-15T23:03:25+08:00

    迟到的答案,但为了记录......

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

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

    find /path/to/your/dir -type f | xargs sha256sum -b
    

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

    find /path/to/your/dir -type f -print0 | xargs -0 sha256sum -b
    
    • 3
  4. Valentin Safonnikov
    2022-03-12T03:18:51+08:002022-03-12T03:18:51+08:00

    要包含子目录中的所有文件,请使用双星号:

    sha256sum /path/to/your/dir/**
    

    它需要启用 globbing。如果没有,请尝试启用它:shopt -s globstar. 有关更多详细信息,请参阅此问题。

    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve