Comme d'autres l'ont expliqué, l'utilisation inotifyest la meilleure solution. Je vais juste expliquer pourquoi votre script échoue. Tout d'abord, quel que soit le langage dans lequel vous programmez, chaque fois que vous essayez de déboguer quelque chose, la première règle est "imprimer toutes les variables":
$ ls
file1 file2 file3
$ echo $PWD
/home/terdon/foo
$ for FILE in "${PWD}/*"; do echo "$FILE"; done
/home/terdon/foo/*
Ainsi, comme vous pouvez le voir ci-dessus, $FILEest en fait étendu à $PWD/*. Par conséquent, la boucle n'est exécutée qu'une seule fois sur la chaîne /home/terdon/foo/* et non sur chacun des fichiers du répertoire individuellement. Ensuite, la md5sumcommande devient:
md5sum /home/terdon/foo/*
En d'autres termes, il s'exécute simultanément md5sumsur tous les fichiers du répertoire cible et non sur chacun d'eux.
Le problème est que vous citez votre expansion globale et cela l'empêche d'être développée:
$ echo "*"
*
$ echo *
file1 file2 file3
Alors que les variables doivent presque toujours être citées , les globes ne devraient pas, car cela les transforme en chaînes au lieu de globes.
Ce que vous vouliez faire, c'est:
for FILE in "${PWD}"/*; do ...
Cependant, il n'y a aucune raison de l'utiliser $PWDici, cela n'ajoute rien d'utile. La ligne ci-dessus équivaut à:
for FILE in *; do
Évitez également d'utiliser des lettres CAPITAL pour les variables shell. Ceux-ci sont utilisés pour les variables d'environnement définies par le système et il est préférable de conserver vos propres variables en minuscules.
Avec tout cela à l'esprit, voici une version améliorée et fonctionnelle de votre 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}"/*; dofonctionne sur le même ensemble,for FILE in *; doil n'est pas exactement équivalent car ce dernier n'inclut pas les chemins d'accès.