Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中进行循环计算哈希比较时?_Bash - Fatal编程技术网

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

在bash中进行循环计算哈希比较时?,bash,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图像文件的零填充扇区数。这是我到目前为止所做的,但它抛出了一个错误,表示它无法打开文件#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"
count=1
zfcount=0
一边读东西;做
计数+=1
如果[$Stuff==“bf619eac0cdf3f68d496ea9344137e8b”];然后
zfcount+=1
fi
echo$Stuff
完成<“$(dd if=test.dd bs=512 2>/dev/null | md5sum | cut-d'-f 1)”
echo“总扇区计数为:$Count”
echo“零填充扇区计数为:$zfcount”

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

使用另一种语言,如Python,它可以在几秒钟内完成这项工作(如果存储可以保持不变):


您的错误消息来自以下行:

done < "$(dd if=test.dd bs=512 2> /dev/null | md5sum | cut -d ' ' -f 1)"
(当然,除了您有不同的散列)。因此,您的shell试图从名为
test.dd
图像的散列文件中读取,但找不到该文件,并发出抱怨


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

只执行
$(dd if=test.dd bs=512 2>/dev/null | md5sum | cut-d'-f 1)
。该值将用作
while..中的文件名。。;完成
结构。这就是你的意图吗?也许您需要
done/dev/null | md5sum | cut-d'-f1))
。(我的意思是
process substation
。我不确定
的语法是否完全正确,您可能需要一个带或的“here string”。不过,我希望管道生成一个值。您需要再次考虑您的目的。Sheller,我只需要将生成的字符串与静态字符串进行比较如果匹配,则增加zfcount。我不希望该字符串用作文件名。我希望扫描所有扇区(或一次512字节)以获取完整文件。Jonathan,你是指我的“完成我同意JL。我认为
这一行:完成,谢谢,那代码非常可靠。我的python几乎不存在。我唯一的评论是你的总扇区计数为off(匹配零计数),但这更多是一个附加信息。当文件都为零时会发生这种情况。如果你例如使用
(head-c$(512*42))生成一个文件head-c$((512*58))|tr'\0'a;)文件
,您将看到“总扇区数:100。归零扇区数:42”。啊,我明白了。我在创建图像时把事情搞砸了。谢谢!这正是我想要的。
done < "$(dd if=test.dd bs=512 2> /dev/null | md5sum | cut -d ' ' -f 1)"
done < e6e8c42ec6d41563fc28e50080b73025