user3715990
user3715990

Reputation: 1

While loop computed hash compare in bash?

I am trying to write a script to count the number of zero fill sectors for a dd image file. This is what I have so far, but it is throwing an error saying it cannot open file #hashvalue#. Is there a better way to do this or what am I missing? Thanks in advance.

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"

Upvotes: 0

Views: 186

Answers (2)

twalberg
twalberg

Reputation: 62489

Your error message comes from this line:

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

What that does is reads your entire test.dd, calculates the md5sum of that data, and parses out just the hash value, then, by merit of being included inside $( ... ), it substitutes that hash value in place, so you end up with that line essentially acting like this:

done < e6e8c42ec6d41563fc28e50080b73025

(except, of course, you have a different hash). So, your shell attempts to read from a file named like the hash of your test.dd image, can't find the file, and complains.

Also, it appears that you are under the assumption that dd if=test.dd bs=512 ... will feed you 512-byte blocks one at a time to iterate over. This is not the case. dd will read the file in bs-sized blocks, and write it in the same sized blocks, but it does not insert a separator or synchronize in any way with whatever is on the other side of its pipe line.

Upvotes: 1

that other guy
that other guy

Reputation: 123650

Doing this in bash is going to be extremely slow -- on the order of 20 minutes for a 1GB file.

Use another language, like Python, which can do this in a few seconds (if storage can keep up):

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

Upvotes: 1

Related Questions