Wie andere erklärt haben, inotify
ist die Verwendung die bessere Lösung. Ich werde nur erklären, warum Ihr Skript fehlschlägt. Unabhängig davon, in welcher Sprache Sie programmieren, lautet die erste Regel "Drucken Sie alle Variablen", wenn Sie versuchen, etwas zu debuggen:
$ ls
file1 file2 file3
$ echo $PWD
/home/terdon/foo
$ for FILE in "${PWD}/*"; do echo "$FILE"; done
/home/terdon/foo/*
Also, wie Sie oben sehen können, $FILE
wird tatsächlich auf erweitert $PWD/*
. Daher wird die Schleife nur einmal für die Zeichenfolge /home/terdon/foo/*
und nicht für jede einzelne Datei im Verzeichnis ausgeführt. Dann wird der md5sum
Befehl:
md5sum /home/terdon/foo/*
Mit anderen Worten, es wird md5sum
auf allen Dateien im Zielverzeichnis gleichzeitig ausgeführt und nicht auf jeder von ihnen.
Das Problem ist, dass Sie Ihre Glob-Erweiterung zitieren und dass sie nicht erweitert werden kann:
$ echo "*"
*
$ echo *
file1 file2 file3
Während Variablen fast immer in Anführungszeichen gesetzt werden sollten, sollten Globs dies nicht tun, da sie dadurch zu Strings anstelle von Globs werden.
Was Sie vorhatten, ist:
for FILE in "${PWD}"/*; do ...
Es gibt jedoch keinen Grund, $PWD
hier zu verwenden , es wird nichts Nützliches hinzugefügt. Die obige Zeile entspricht:
for FILE in *; do
Vermeiden Sie außerdem die Verwendung von GROSSBUCHSTABEN für Shell-Variablen. Diese werden für die vom System festgelegten Umgebungsvariablen verwendet, und es ist besser, die eigenen Variablen in Kleinbuchstaben zu halten.
Vor diesem Hintergrund finden Sie hier eine funktionierende, verbesserte Version Ihres Skripts:
#!/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
am selben Setfor FILE in *; do
, ist aber nicht genau gleichwertig, da letzteres die Pfadnamen nicht enthält.