Алексей Владыкин


Paranoid copy

17 июля 2011

Откопал в залежах старого добра скрипт под названием «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. К счастью, вторая попытка копирования всегда оказывалась успешной, так что все файлы переехали благополучно.

К оглавлению блога