在bash中循环计算哈希比较?

时间:2014-06-06 17:28:25

标签: bash

我正在尝试编写一个脚本来计算dd图像文件的零填充扇区数。这是我到目前为止所做的,但是它抛出一个错误,说它无法打开文件#hashvalue#。有没有更好的方法来做到这一点或我错过了什么?提前谢谢。

count=1
zfcount=0
while read Stuff; do
count+=1
if [ $Stuff == "bf619eac0cdf3f68d496ea9344137e8b" ]; then
zfcount+=1
fi
echo $Stuff
done < "$(dd if=test.dd bs=512 2> /dev/null | md5sum | cut -d ' ' -f 1)"
echo "Total Sector Count Is: $count"
echo "Zero Fill Sector Count is: $zfcount"

2 个答案:

答案 0 :(得分:1)

在bash中执行此操作将非常慢 - 对于1GB文件大约需要20分钟。

使用其他语言,如Python,可以在几秒钟内完成此操作(如果存储可以跟上):

python -c '
import sys
total=0
zero=0
file = open(sys.argv[1], "r")
while True:
  a=file.read(512)
  if a:
    total = total + 1
    if all(x == "\x00" for x in a):
      zero = zero + 1
  else:
    break
print "Total sectors: " + str(total)
print "Zeroed sectors: " + str(zero)
' yourfilehere

答案 1 :(得分:1)

您的错误消息来自此行:

done < "$(dd if=test.dd bs=512 2> /dev/null | md5sum | cut -d ' ' -f 1)"

它的作用是读取您的整个test.dd,计算该数据的md5sum,然后仅解析哈希值,然后将其包含在$( ... )内,将哈希值替换为适当的位置,因此您最终会以这样的方式执行此操作:

done < e6e8c42ec6d41563fc28e50080b73025

(当然,除了你有一个不同的哈希)。因此,您的shell会尝试从名为test.dd图片哈希的文件中读取,无法找到该文件,并会抱怨。

此外,您似乎假设dd if=test.dd bs=512 ...将一次一个地提供512字节块进行迭代。不是这种情况。 dd将读取bs大小的块中的文件,并将其写入相同大小的块中,但它不会插入分隔符或以任何方式与其管道另一侧的任何内容同步线。