Om man vill ha en progress-bar till dd...
Postat: 05 nov 2010, 19:35
Ibland kan det vara trevligt med en progress-bar till dd, så man ser hur arbetet fortskrider. Det här är egentligen ett ganska enkelt script som skulle kunna vidareutvecklas, men som det är nu så täcker det mina behov...

Kod: Markera allt
#! /bin/bash
#
function isnum {
echo ">>$1"
if [[ $1 =~ ^[0-9]+$ ]]; then
echo ">1=$1"
return 1
fi
echo ">0"
return 0
}
function drawbar {
NEWFILE=$1
OLDSIZE=$2
touch $NEWFILE
while [[ true ]]; do
let NEWSIZE=$(ls -l $NEWFILE | awk '{ print $5 }')
let Q=$((100*NEWSIZE/OLDSIZE))
#
let K=$((100-$Q))
#
echo -n "["
I=$Q
while [[ $I -gt 0 ]]; do
echo -n "="
let I=$I-1
done
I=$K
while [[ $I -gt 0 ]]; do
echo -n " "
let I=$I-1
done
echo -n "] $Q% "
#
if [[ $Q -ge 100 ]]; then
break
fi
#
sleep 1
printf "\r"
done
}
#
if [[ -z $1 || -z $2 ]]; then
echo
echo "-At least two parameters required, if= and of="
echo
exit
fi
N=$#
PARAM=$@
#
let i=1
for P in $PARAM; do
IF=$(echo $P | awk '{ print index($1,"if=") }')
OF=$(echo $P | awk '{ print index($1,"of=") }')
if [[ $IF != 0 ]]; then
INFILE=$(echo $P | awk '{ split($0, p, "="); print p[2]; }')
elif [[ $OF != 0 ]]; then
OUTFILE=$(echo $P | awk '{ split($0, p, "="); print p[2]; }')
fi
let i=i+1
done
#
echo
file $INFILE | grep "block special" >> /dev/null
if [[ $? == 0 ]]; then
PART=$(echo $INFILE | awk '{ split($0, p, "/"); print p[3]; }')
DEV=$(echo $PART | awk '{ print substr($0,1,3) }')
#SZ=$(parted $INFILE unit B print | awk '{y=x; x=$4};END{print y}' | sed 's/B//')
SIZE=$(expr 512 '*' $(cat /sys/block/$DEV/$PART/size))
else
SIZE=$(ls -l $INFILE | awk '{ print $5 }')
fi
LOG=$(mktemp)
dd $PARAM > $LOG 2>&1 &
PID=$(jobs -l | grep "dd \$PARAM" | awk '{ print $2 }')
drawbar $OUTFILE $SIZE
echo
echo "Checking PID=$PID"
wait $PID
echo "OK"
cat $LOG
rm $LOG
echo