从给定文件继续目录树校验和

从给定文件继续目录树校验和

我有:

  • 一个checksum.txt文件,其中包含来自大型目录中安装点的单个文件的多行校验和,该文件安装后断开连接,从而未完成checksum.txt(部分校验和)
  • localchecksums.txt完整的校验和列表,包含数千行 SHA256 校验和以及文件名等。

我想:

  • 将远程安装校验和与本地校验和进行比较sha256sum -c checksum.txt localchecksum.txt或类似,但是:
  1. 我不想再次通过千兆字节的数据来获取剩余的哈希值
  2. 我不想重新启动整个过程checksum.txt

find我通过使用递归查找单个文件并sha256sum对其执行来生成列表。

可以通过比较两个文件来获取剩余的哈希值,或者以某种方式通过读取文件checksum.txt并仅计算未检查文件的校验和来继续检查校验和。第一种方法的问题是文件中的顺序不同。第二种方法听起来不错,但我不知道如何开始。

任何校验和文件的示例:

8e2931cc1ad3adc07df115456b36b0dbd6f80f675e0a9813e20ad732ae5d4515  ./folder/8ggSHp5I7hNEl3vDCbWv6Q/wA-KzXIh1Ce3G93s20X24v_4vUeywBe3mXPhGjPt_Lg/cRf8KgbqIsqwbon3DX3PN1-oV6_Nr9Baeymaw-ZJw00
37d2dfe2315cc401536329e3fbe421384bbb50c656c3dbeb42798e5666822e6c  ./folder/8ggSHp7I7hHEl3vDCbWv6Q/wA-KzXIh1Ce3G93s2oX24v_4vUeywBe3mXPhGjPt_Lg/V02s6HKhyJ9Nyd2jQtSjWg
d0e9b95065a264db0d372ccace5d3a72f38f74ca7b44da4794dae23c91e18e57  ./folder/8ggSHp7I7hNxl3vDCbWv6Q/wA-KzXIh1Ce3G93s2oX24v_4vUeywBe3mXPhGjPt_Lg/U3fhBugX6pexYzh6qGKlW7lYWsFShWH7JwN9fmU8ay2lLZkciH2sXsiGbmIc97iJ
44a5fe29063e472857bb9a1929af06a32bb4b2394630f80c2dc732fd662620bc  ./folder/8ggSHp7I7hNEc3vDCbWv6Q/wA-KzXIh1Ce3G93s2oX24v_4vUeywBe3mXPhGjPt_Lg/gTrqUL4ZjWTWMl6BcjfwUe5bBDatscwUoYY9IFQDztc

答案1

原则,

  1. sort已带有校验和的文件名列表
  2. find以及sort文件名的完整列表
  3. 用于comm获取尚未处理的文件集(一组中的文件不在另一组中)
  4. sha256sum为结果列表中的文件生成校验和

示范(bashsh):

based=/etc                      # Directory base
csums=/tmp/etc_checksums.txt    # Checksums file

# EXAMPLE ONLY
# TAKE CARE NOT TO OVERWRITE YOUR REAL DATAFILE WHILE TESTING !!
# Generate a partial set of 30 checksums
find "$based" -type f |
    head -n30 |
    while IFS= read -r f; do sha256sum "$f"; done >"$csums"


# USEFUL WORK
# Identify the set of differences
LC_ALL=C comm -13 <(sed 's/^[^ ]*  //' "$csums" | LC_ALL=C sort) <(find "$based" -type f | LC_ALL=C sort) |
    # For each missing item
    while IFS= read -r f
    do
        # Generate a new checksum and append it to the checksums file
        printf '%s' "$f" >&2
        sha256sum -- "$f" >>"$csums" && echo >&2
    done

此代码适用于包含空格的文件名,但不适用于包含换行符和其他不可打印字符的病态文件名。 (毫无疑问,如果确实需要,其他人可以建议如何对代码进行防弹。)

在修改原始校验和文件之前请仔细测试。确保与$based您的原始起点匹配,以便comm可以正确过滤掉重复项。

相关内容