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.md5sum -- "$file"
anstattmd5sum "$file"
den Fall zu behandeln , wo eine Datei mit einem beginnt-
. Natürlich sollten Sie auch dafür sorgen, dass Ihre Implementierung von md5sum das--
Ende des Optionsbegrenzers unterstützt.Sie können inotify-tools definitiv über die Befehlszeile verwenden, z. B.: So:
Vom Menschen inotifywait
Und hier ist ein Skript, das kontinuierlich überwacht und aus der Man-Datei von kopiert wird
inotifywait
:quelle
Mit dem
inotify-tools
Paket können Sie alle Änderungen in einem Ordner in Echtzeit überwachen. Zum Beispiel enthält es dasinotifywait
Tool, das Sie wie folgt verwenden können:Sie können Flags verwenden, um nur bestimmte Ereignisse oder bestimmte Dateien zu filtern. Das
inotifywatch
Tool sammelt Statistiken zur Dateisystemnutzung und gibt die Anzahl derinotify
Ereignisse aus.Weitere Beispiele finden Sie hier zum Beispiel.
Wenn Sie mit anderen Tools überwachen möchten, können Sie
find
mit dem-mmin
Parameter (geänderte Minuten) verwenden. Da 2 Sekunden 0,033 Minuten entsprechen, können Sie Folgendes verwenden:quelle
Wenn Sie im Abstand von zwei Sekunden überwachen möchten, können Sie Ihren Scheck umgeben mit:
Während dies nacheinander nach Dateien testet und 2 Sekunden auf jede gefundene Datei wartet, schlage ich vor, Ihre Prüfung in eine Funktion umzuwandeln:
Welches kann in der
while
Schleife verwendet werden:Bitte beachten Sie das
&
kaufmännische Und, um die Überprüfungen im Hintergrund durchzuführen und die Dateiprüfungen parallel durchzuführen. Beachten Sie, dass dies abhängig von der Anzahl der im Verzeichnis gefundenen Dateien die Leistung beeinträchtigen kann.Beachten Sie auch, dass ich die
echo
Zeilen so geändert habe , dass sie den Dateinamen ("$@"
) enthalten, um zu visualisieren, welche Datei identisch / unterschiedlich ist.quelle
quelle