Test ob zwei Verzeichnisse denselben Inhalt haben

  • Nachdem ich jetzt mein Backupscript erweitert habe, dass es rsync benutzt moechte ich es testen. D.h. ich werde bestimmte Verzeichnisse mit unterschiedlichen Inhalten erstellen incl hardlinks und softlinks und möchte diesen nach dem Backup vergleichen. D.h. ich will testen, ob die Dateien gleich sind, und dieselben Eigenschaften haben. Gefunden habe ich dazu Vorschläge wie

    1) diff -qr DIR1 DIR2
    2) rsync -rvnc DIR1 DIR2

    Leider prüft da nix die Eigenschaften (Owner, Flags) wie auch den Inhalt. Auch Wird kein Unterschied festgestellt on eine Datein einen soft- oder hardlink benutzt bzw eine Kopie ist.

    Kurzum: Hat jemand einen guten Vorschlag wie man am sichersten testen kann, ob ein Backup identisch zu dem Original ist und dabei die Datei- und Verzeichniseigenschaften sowie symlinks und hardlinks überprüft?

    • Offizieller Beitrag

    hmmm könnte man es nicht mit ls arbeiten?
    So zum Beispiel:

    ls -al SRC > dirA; ls -al DST > dirB;

    und dann einen schönen diff dirA dirB
    normalerweise (wenn alles gleich ist) sollte nix bei rum kommen...

    Ich bin ein gefallener Engel namens Turael.

    Einst vor langer Zeit rebelierte ich im Himmel bis Gott mich auf die Erde verbannte.

    Doch meine taten werden kein ende finden....

    Einmal editiert, zuletzt von Turael (2. September 2013 um 20:39)

  • Um eine Liste zubekommen was zwischen den Verzeichnissen unterschiedlich ist.

    Code
    find dir1.txt | xargs md5 > dir1.txt
    find dir2.txt | xargs md5 > dir2.txt
    diff dir1.txt dir2.txt

    Um Symlinks zu finden kannst Du folgendes benutzen:

    Code
    find . -maxdepth 2 -type l 
    # oder wenn Du die Datei schon kennst und checken willst:
    test -L $DATEI; RETVAL=$?; if [ $RETVAL -eq 0 ]; then echo "ist ein Link"; fi

    Das ganze jetzt alle verknüpfen und in einen Einzeiler packen:

    Code
    find dir1.txt | xargs md5 > dir1.txt; find dir2.txt | xargs md5 > dir2.txt; for FILEPATH in $(diff dir1.txt dir2.txt | grep "> " | awk '{print $3}') ; do echo -n "Check auf den Inhalt: "; file $FILEPATH; echo -n "Check auf Link: "; test -L $FILEPATH; RETVAL=$?; if [ $RETVAL -eq 0 ]; then echo "ist ein Link"; else echo "Ist kein Link"; fi done

    Ist das das was Du suchst und willst? Ansonsten bessern wir da gleich noch mal nach ;)

  • So und jetzt noch etwas hinterher damit Du an Deinen User oder Gruppe kommst

    An den User kannst Du auch mit

    Code
    find $directoryname -maxdepth 0 -printf '%u\n'

    kommen, nur dann musst Du sicherstellen das "find" in einer Version vorhanden ist. Embedded Systeme haben manchmal BusyBox im Einsatz und dort kennt find kein -printf

  • Ich würd das über ein Script regeln - ist vielleicht ein bischen aufwending für so ein Test aber vermutlich "das sicherste"..
    Wenn "ls -la" zu vergleichen nicht reicht ginge es auch mit stat , da kann man den jeweiligen Status penibel vergleichen - weil ich denke der checksum der Datei reicht ja nicht...


    Ein erster Ansatz wäre zum Beispiel:


    ..da fehlt nur noch der tatsächliche Vergleich.. :D

    Ausgabe:

  • Danke liebe Freunde für die verschiedenen Vorschläge. Ich dachte es gäbe vielleicht einen einfachen Weg. Sieht wohl nicht so aus :(

    Jetzt sehe ich mir Eure Vorschläge genauer an. Vermutlich wird es eine Kombination aus verschiedenen Tests werden. Keep you posted :)

  • Das ist das Problem bei dem was du machen willst. Nur herausfinden welche Dateien sich geändert haben ist recht einfach.
    Dann davon aber noch die File Attribute abfragen und dann zu checken ist der kniffelige Teil an dem Vorhaben. Ist zwar nicht unmöglich, nur macht es das etwas aufwändiger.
    Daher wird es dann eher ein etwas grösseres Script.

  • Den Vorschlag von meigrafd habe ich aufgenommen, da er auch die Möglichkeit bietet nach Hardlinks zu prüfen. Allerdings funktioniert das nur wenn genau ein Backup existiert, denn nach dem zweiten Backup ist der UseCount 2 im Backup und im Original immer noch 1.

    Ein paar Änderungen musste ich noch vornehmen - wie z.B. um Datei/Verzeichnis-Namen mit Leerzeichen verarbeiten zu können (Typisches bash Problem) und noch ein paar kleinere Dinge. Das Script funktioniert soweit perfekt bei kleineren DirectoryBackups. Aber beim Backup von / bekomme ich einen SegFault :(. Keine Ahnung warum. Anbei meine geänderte Version von meigrafd :

  • Mit bash ist mir das zu umständlich geworden das hinzubekommen. Anbei mein Ergebnis mit Python und dem Ansatz von meigrafd. Ist nicht schön aber tut was es soll. Vielleicht kann es ja jemand gebrauchen. Überprüft werden die Dateiattribute, gid und uid sowie Dateigrösse.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!