Comme d'autres l'ont expliqué, l'utilisation inotify
est 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, $FILE
est 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 md5sum
commande devient:
md5sum /home/terdon/foo/*
En d'autres termes, il s'exécute simultanément md5sum
sur 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 $PWD
ici, 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}"/*; do
fonctionne sur le même ensemble,for FILE in *; do
il n'est pas exactement équivalent car ce dernier n'inclut pas les chemins d'accès.