Резервное копирование на удаленном сервере в зашифрованной папке

Как уже объяснили другие, использование inotify является лучшим решением. Я просто объясню, почему ваш сценарий не работает. Во-первых, независимо от того, на каком языке вы программируете, когда вы пытаетесь отладить что-то, первое правило - "выведите все переменные":

$ ls
file1  file2  file3
$ echo $PWD    
/home/terdon/foo
$ for FILE in "${PWD}/*"; do echo "$FILE"; done
/home/terdon/foo/*

Итак, как вы видите выше, $FILE фактически расширяется до $PWD/*. Таким образом, цикл выполняется только один раз для string /home/terdon/foo/*, а не для каждого файла в каталоге по отдельности. Тогда команда md5sum становится:

md5sum /home/terdon/foo/*

Другими словами, она запускает md5sum на все файлы в целевом каталоге сразу, а не на каждый из них.

Проблема в том, что вы заключаете расширение glob в кавычки, и это мешает его расширению:

$ echo "*"
*
$ echo *
file1 file2 file3

В то время как переменные почти всегда должны заключаться в кавычки, глобы не должны, поскольку это превращает их в строки, а не глобы.

Вы хотели сделать следующее:

for FILE in "${PWD}"/*; do ...

Однако нет причин использовать здесь $PWD, это не добавляет ничего полезного. Строка выше эквивалентна:

for FILE in *; do

Кроме того, избегайте использования КАПИТАЛЬНЫХ букв для переменных оболочки. Они используются для системных переменных окружения, а ваши собственные переменные лучше писать в нижнем регистре.

Учитывая все это, вот рабочая, улучшенная версия вашего скрипта:

#!/bin/bash
for file in *
do
    sum1="$(md5sum "$file")"
    sleep 2
    sum2="$(md5sum "$file")"
    if [ "$sum1" = "$sum2" ];
    then
        echo "Identical"
    else
        echo "Different"
    fi
done

2
30.05.2015, 01:02
0 ответов

Теги

Похожие вопросы