Como outros explicaram, usar inotify
é a melhor solução. Eu só vou explicar porque seu script falha. Primeiro de tudo, não importa em que idioma você está programando, sempre que você tentar depurar algo, a primeira regra é "imprimir todas as variáveis":
$ ls
file1 file2 file3
$ echo $PWD
/home/terdon/foo
$ for FILE in "${PWD}/*"; do echo "$FILE"; done
/home/terdon/foo/*
Então, como você pode ver acima, $FILE
está realmente expandido para $PWD/*
. Portanto, o loop só é executado uma vez na string /home/terdon/foo/*
e não em cada um dos arquivos no diretório individualmente. Então, o comando md5sum
se torna:
md5sum /home/terdon/foo/*
Em outras palavras, ele executa md5sum
em todos os arquivos no diretório de destino de uma vez e não em cada um deles.
O problema é que você está citando sua expansão glob e impede que ela seja expandida:
$ echo "*"
*
$ echo *
file1 file2 file3
Embora variáveis devam ser sempre citadas , as globs não deveriam transforma-os em cordas em vez de globs.
O que você pretendia fazer é:
for FILE in "${PWD}"/*; do ...
No entanto, não há motivo para usar $PWD
aqui, não está adicionando nada útil. A linha acima é equivalente a:
for FILE in *; do
Além disso, evite usar letras maiúsculas para variáveis do shell. Esses são usados para as variáveis ambientais definidas pelo sistema e é melhor manter suas próprias variáveis em letras minúsculas.
Com tudo isso em mente, aqui está uma versão aprimorada e funcional do seu script:
#!/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