Автор: 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
# Bash Справочник v0.05 © 2007-2026 Igor Salnikov aka SunDoctor