Блочное копирование с контролем хеш-сумм


Автор: Artix

Возникла задача - снять данные с полумертвого диска, который при чтении очень косячил и выдавал разные данные.
Для этого был написан скрипт, который читал заданный файл мелкими блоками и проверял каждый блок отдельно.

./bincopy.sh from to

#!/bin/bash
s=0
bs=1k
cnt=1

if [ $# -ne 2 ]
then
  exit
fi

inp=$1
out=$2

p=`date | md5sum | cut -f1 -d ' '`

echo "COPY $inp => $out"

if [ -e "$out" ]
then
  rm "$out"
fi

while (( 1 ))
do
  c0=`dd if=$inp bs=$bs count=$cnt skip=$s status=none | md5sum | cut -f1 -d ' '`
  dd if=$inp bs=$bs count=$cnt skip=$s status=none > _"$p"_1
  dd if=$inp bs=$bs count=$cnt skip=$s status=none > _"$p"_2
  if [ -s _"$p"_1 ] && [ -s _"$p"_2 ]
  then
    c1=`md5sum _"$p"_1 | cut -f1 -d ' '`
    c2=`md5sum _"$p"_2 | cut -f1 -d ' '`
    echo "$c0 : $c1 : $c2"
    if [ "$c1" == "$c2" ] && [ "$c0" == "$c1" ]
    then
      cat _"$p"_1 >> $out
    else
      echo "ERROR CYCLE: $s"
      exit
    fi
  else
    break
  fi
  ((s += $cnt))
done

if [ -e _"$p"_1 ]
then
  rm _"$p"_1
fi

if [ -e _"$p"_2 ]
then
  rm _"$p"_2
fi

md5sum $inp
md5sum $out

#