Come altri hanno spiegato, l'uso inotify
è la soluzione migliore. Spiegherò solo perché la tua sceneggiatura fallisce. Prima di tutto, indipendentemente dal linguaggio in cui stai programmando, ogni volta che provi a eseguire il debug di qualcosa, la prima regola è "stampa tutte le variabili":
$ ls
file1 file2 file3
$ echo $PWD
/home/terdon/foo
$ for FILE in "${PWD}/*"; do echo "$FILE"; done
/home/terdon/foo/*
Quindi, come puoi vedere sopra, in $FILE
realtà è espanso a $PWD/*
. Pertanto, il ciclo viene eseguito solo una volta sulla stringa /home/terdon/foo/*
e non su ciascuno dei file nella directory singolarmente. Quindi, il md5sum
comando diventa:
md5sum /home/terdon/foo/*
In altre parole, viene eseguito md5sum
su tutti i file nella directory di destinazione contemporaneamente e non su ciascuno di essi.
Il problema è che stai citando l'espansione glob e che ne impedisce l'espansione:
$ echo "*"
*
$ echo *
file1 file2 file3
Mentre le variabili dovrebbero quasi sempre essere citate , i globs non dovrebbero, dal momento che le trasformano in stringhe anziché globs.
Quello che intendevi fare è:
for FILE in "${PWD}"/*; do ...
Tuttavia, non c'è motivo di utilizzare $PWD
qui, non sta aggiungendo nulla di utile. La riga sopra è equivalente a:
for FILE in *; do
Inoltre, evitare di usare lettere maiuscole per le variabili shell. Questi vengono utilizzati per le variabili ambientali impostate dal sistema ed è meglio mantenere le proprie variabili in minuscolo.
Con tutto questo in mente, ecco una versione funzionante e migliorata del tuo 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
funziona sullo stesso set in quantofor FILE in *; do
non è esattamente equivalente perché quest'ultimo non include i nomi dei percorsi.