Как уже объяснили другие, использование 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