Bash-Skript zum Überprüfen, ob eine Datei geändert wurde oder nicht

Bash-Skript zum Überprüfen, ob eine Datei geändert wurde oder nicht

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, inotifywaitalarm für mich

z.B;

echo "bh" > /tmp/testfile

inotifywaitzeige diese Nachricht:

$ inotifywait -m -e modify /tmp/testfile
Setting up watches.  
Watches established.
testfile MODIFY 
testfile MODIFY 

Sie können die Ausgabe auch auf whiledie 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 $1konsequentmitdie Trennräume undinnen $( ... ). Noch besser: stat -c %y "$1"Funktioniert, wenn Ihr Dateiname Leerzeichen oder andere „Globbing“-Zeichen enthält

  • Test mit klassischem [ ... ]oder test ...und "$var"(weil stat %yes Leerzeichen enthält; stat %Ywü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ühren

  • etwas 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 

verwandte Informationen