Paranoid copy
Откопал в залежах старого добра скрипт под названием «Paranoid Copy». Он прекрасно иллюстрирует тезис «голь на выдумки хитра», а также является примером advanced Bash scripting.
#!/bin/sh
declare -a files
for i in `seq 1 $#`; do
eval "val=\$$i"
if [ "$i" -lt "$#" ]; then
files[$i]=$val
else
destdir=$val
fi
done
if [ -z "${files[*]}" -o \! -d "$destdir" ]; then
echo "Usage: $0 file1 [file2 [...]] destdir"
exit 1
fi
for i in `seq 1 $(($#-1))`; do
file=${files[$i]}
( \
echo -n "Copying $file to $destdir ..." && \
cp "$file" "$destdir" && \
diff "$file" "$destdir/$file" && \
echo "OK" \
) || \
( \
echo -n "Retry 1 ..." && \
cp "$file" "$destdir" && \
diff "$file" "$destdir/$file" && \
echo "OK" \
) || \
( \
echo -n "Retry 2 ..." && \
cp "$file" "$destdir" && \
diff "$file" "$destdir/$file" && \
echo "OK" \
) || echo "Failed 3 times, giving up"
done
Скрипт копирует набор файлов в заданную директорию. После копирования делает
diff
исходного файла и скопированного. Если файлы одинаковые (diff вернул 0),
скрипт переходит к следующему файлу. Если diff нашел различия (код возврата
отличен от нуля), то цикл копирование-сравнение повторяется. После копирования
файлов таким скриптом параноики могут спать спокойно :)
Я написал этот скрипт, когда переносил все файлы со своего старого NAS WD NetCenter на новое место житества. Было недоказанное подозрение, что при копировании файлов на NetCenter или обратно иногда происходили искажения данных. В процессе копирования подозрение подтвердилось: несколько файлов пошли на Retry 1. К счастью, вторая попытка копирования всегда оказывалась успешной, так что все файлы переехали благополучно.