我有:
- 一个
checksum.txt
文件,其中包含来自大型目录中安装点的单个文件的多行校验和,该文件安装后断开连接,从而未完成checksum.txt
(部分校验和) localchecksums.txt
完整的校验和列表,包含数千行 SHA256 校验和以及文件名等。
我想:
- 将远程安装校验和与本地校验和进行比较
sha256sum -c checksum.txt localchecksum.txt
或类似,但是:
- 我不想再次通过千兆字节的数据来获取剩余的哈希值
- 我不想重新启动整个过程
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
原则,
sort
已带有校验和的文件名列表find
以及sort
文件名的完整列表- 用于
comm
获取尚未处理的文件集(一组中的文件不在另一组中) sha256sum
为结果列表中的文件生成校验和
示范(bash
不sh
):
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
可以正确过滤掉重复项。