Como outros explicaram, usar inotify
é a melhor solução. Vou apenas explicar por que seu script falha. Primeiro de tudo, não importa em qual 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
é realmente expandido para $PWD/*
. Portanto, o loop é executado apenas uma vez na cadeia /home/terdon/foo/*
e não em cada um dos arquivos no diretório individualmente. Então, o md5sum
comando se torna:
md5sum /home/terdon/foo/*
Em outras palavras, ele é executado md5sum
em todos os arquivos no diretório de destino de uma só 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
Enquanto as variáveis quase sempre devem ser citadas , os globs não devem, pois isso os transforma em strings em vez de globs.
O que você pretendia fazer é:
for FILE in "${PWD}"/*; do ...
No entanto, não há razão para usar $PWD
aqui, não está adicionando nada de útil. A linha acima é equivalente a:
for FILE in *; do
Além disso, evite usar letras maiúsculas para variáveis de shell. Elas são usadas para as variáveis ambientais definidas pelo sistema e é melhor manter suas próprias variáveis em minúsculas.
Com tudo isso em mente, aqui está uma versão melhorada 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
for FILE in "${PWD}"/*; do
trabalha no mesmo conjunto,for FILE in *; do
não é exatamente equivalente, porque o último não inclui os nomes de caminho.