Ich versuche, ein Skript zu schreiben, um zu prüfen, ob eine Datei geändert wurde oder nicht. Wenn dies der Fall ist, sollte dies der Fall sein echo "Error!"
, wenn nicht, wird das Skript weiter ausgeführt.
Mein Skript
#!/bin/bash
date=$(stat -c %y)$1
while true
do date2=$(stat -c %y$1)
if (date2 != date)
echo "error!"
done
Liegen Fehler vor?
Antwort1
Sie können verwenden inotifywait
,mehr lesen
inotifywait - Warten auf Änderungen an Dateien mit inotify
inotifywait wartet effizient auf Änderungen an Dateien unter Verwendung der inotify(7)-Schnittstelle von Linux. Es eignet sich zum Warten auf Änderungen an Dateien durch Shell-Skripte. Es kann entweder beendet werden, sobald ein Ereignis eintritt, oder kontinuierlich ausgeführt werden und Ereignisse ausgeben, sobald sie auftreten.
verwenden Sie diesen Befehl:
$ inotifywait -m -e modify /tmp/testfile
wenn ich schreibe in testfile
, inotifywait
alarm für mich
z.B;
echo "bh" > /tmp/testfile
inotifywait
zeige diese Nachricht:
$ inotifywait -m -e modify /tmp/testfile
Setting up watches.
Watches established.
testfile MODIFY
testfile MODIFY
Sie können die Ausgabe auch auf while
die folgende Anweisung umleiten:
while read j
do
echo "file changed"
break
done < <(inotifywait -q -e modify /tmp/testfile)
Antwort2
filename="$1"
m1=$(md5sum "$filename")
while true; do
# md5sum is computationally expensive, so check only once every 10 seconds
sleep 10
m2=$(md5sum "$filename")
if [ "$m1" != "$m2" ] ; then
echo "ERROR: File has changed!" >&2
exit 1
fi
done
Antwort3
Wenn Sie „manuell“ nach Änderungen im Änderungszeitstempel suchen möchten und nicht nach tatsächlichen Unterschieden im Inhalt, benötigen Sie:
stat -c %y $1
konsequentmitdie Trennräume undinnen$( ... )
. Noch besser:stat -c %y "$1"
Funktioniert, wenn Ihr Dateiname Leerzeichen oder andere „Globbing“-Zeichen enthältTest mit klassischem
[ ... ]
odertest ...
und"$var"
(weilstat %y
es Leerzeichen enthält;stat %Y
würde das vermeiden) oder mit Bash-erweitert,[[ ... ]]
das keine Anführungszeichen benötigt -- aber nicht,( ... )
das etwas völlig anderes tut, nämlich in einer Subshell ausführenetwas Verzögerung zwischen den Schleifen, damit das System nicht völlig überlastet wird
#!/bin/bash
date=$(stat -c %y "$1")
while sleep 1; do date2=$(stat -c %y "$1")
if [[ $date2 != $date ]]; then echo "changed!"; break; fi
# possibly exit [status] instead of break
# or if you want to watch for another change, date=$date2
done
Antwort4
Erwägen Sie die Verwendung von md5sum, da dies sicherer ist, um echte Dateiänderungen zu überprüfen. Dieses Skript gibt „Die Dateien sind unterschiedlich“ zurück, wenn eine Datei von der anderen abweicht, aber wenn Sie sie dann angleichen, wird es wieder sagen, dass die Dateien gleich sind.
#!/bin/bash
loop1(){
while sleep 1
do
md5f1=$(md5sum "$1" | cut -d' ' -f1)
md5f2=$(md5sum "$2" | cut -d' ' -f1)
if [ "$md5f2" != "$md5f1" ]; then
echo "The files are different now."
#stop loop:
break
fi
done
}
loop2(){
while sleep 1
do
md5f1=$(md5sum "$1" | cut -d' ' -f1)
md5f2=$(md5sum "$2" | cut -d' ' -f1)
if [ "$md5f2" == "$md5f1" ]; then
echo "The files are equal again."
#stop loop:
break
fi
done
}
while true; do
loop1 "$1" "$2"
loop2 "$1" "$2"
done
Speichern Sie es als Autovergleich und führen Sie es wie folgt aus:
./autocompare file1 file2