Sh-Script: Verzeichnisänderung abfragen

Dieses Thema im Forum "Programmieren" wurde erstellt von micp, 22 März 2012.

  1. micp

    micp New Member

    Registriert seit:
    18 März 2012
    Beiträge:
    3
    Hallo,
    wie kann ich das /usr/src Verzeichnis auf Veänderung prüfen, das heisst, Files gelöscht/neu hinzugekommen oder etwas editiert (durch csup)? Dabei ist nur wichtig, ob sich in dem Verzeichnis etwas geändert hat.
    Idee war
    ~# du /<dir>/ |tail -N 1|awk {'print $1'}
    um das erste Feld der letzten Ausgabzeile (die Summe aller Dateigrössen) zu bekommen. Nach einem 'make update', das einiges aktualisierte, klappte es auch, der Wert änderte sich. Nach einem zweiten, kurz danach, csup editierte nur eine Datei, nicht mehr, der Wert blieb, trotz Änderung im Verzeichnis, gleich.

    Wie könnte ich es noch zuverlässig abfragen?
    Zum Einsatz kommt FreeBSD 9 64bit und die (a)sh


    viele Grüsse
  2. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    325
    Eine Änderung im Inhalt hat nicht immer eine Änderung der Dateigröße als Konsequenz. Am sichersten gehst du IMHO, wenn du eine Prüfsumme auf die Datei anwendest. Es muss ja nicht MD5/SHA sein, es reicht sicherlich auch etwas, was Dateigröße+mtime verknüpft, so wie es rsync macht.

    Rob
  3. Tron

    Tron Member

    Registriert seit:
    21 April 2004
    Beiträge:
    275
    Code:
    #! /bin/sh
    set -e -u
    
    SRC='/usr/src/'
    CMP='/usr/.src-compare'
    
    if [ ! -e "$CMP" -o "$CMP" -ot "$SRC" ]; then
      echo "$SRC changed"
      # ...
      # now do stuff
      # ...
      touch -r "$SRC" "$CMP"
    fi
    
    Achtung: Das detektiert nur Änderungen in /usr/src selbst, nicht in dessen Unterverzeichnissen! Aber du schriebst, dass das das ist, was du willst.
  4. micp

    micp New Member

    Registriert seit:
    18 März 2012
    Beiträge:
    3
    Netter Gedanke, wird mal für später abgespeichert.
    Leider hat er hier nicht funktioniert, weil, unerwartet, der Timestamp von /usr/src nicht gändert wird, wenn da drunter nur was editiert wurde. Habe es getestet, indem ich in der /usr/src/UPDATING einen beliebigen Buchstaben ersetzt habe, Datei geändert, Grösse bleibt gleich, auch etwas hinzugefügt, Grösse ändert sich, aber die Zugriffszeit von /usr/src nicht. Kopieren einer Datei da rein, klappt es. Merkwürdig.

    Danke bis hierhin. Ich tüftele noch ein bisschen, wäre in der Zwischenzeit für weitere Hinweise dankbar. Was letztendlich geklappt hat, poste ich dann hier rein.
  5. Yamagi

    Yamagi Possessed With Psi Powers Mitarbeiter

    Registriert seit:
    14 April 2004
    Beiträge:
    7.201
    Wohnort:
    Schleswig-Holstein
  6. micp

    micp New Member

    Registriert seit:
    18 März 2012
    Beiträge:
    3
    Guten Morgen,
    nach stundenlangem Googlen und Ausprobieren gestern habe ich mich mich jetzt für ein anderes Vorgehen entschieden: nicht mehr fragen, ob /usr/src sich verändert hat, sondern ob csup etwas gemacht hat.
    Code:
    [...]
    csup -L 2 -h cvsup8.FreeBSD.org /etc/stable-supfile 2>&1 |tee /usr/src/update-src.log
    grep -iE "(Add|Checkout|Edit|Delete)" /usr/src/update-src.log
    if [ $? = 0 ]; then
    	echo -e "\nSourcen aktualisiert"
    else
    	echo -e "\nSourcen unveraendert"
    fi
    rm /usr/src/update-src.log
    [...]
    
  7. mark05

    mark05 Member

    Registriert seit:
    19 November 2003
    Beiträge:
    659
    Wohnort:
    Bergisch Gladbach
    moin

    alternativ kann man shell befehl stat verwenden , jedoch muss man dann eine 2te tabelle da vorhalten
    mit den letzten prueft werten.


    ich habe mir ein perl modul gebaut was mit dem perl stat dateien und verzeichnisse ueberwacht.

    sieht im prinzip dann so aus.

    Code:
    
    use FileWatch;
    
    my $fw=FileWatch->new();
    
    $fw->fw_add({file=>myfile2monitor,});
    
    while (1) {
     my $monitor=$fw->fw_check();
     if ( $monitor->{'returncode'} =~  /[_]_new[_]events/smx ) {
        # do something 
    }
    
    sleep 5 ; # interval
    }
    
    holger
    Zuletzt bearbeitet: 23 März 2012