verzeichnisse vergleichen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Tannah, 16.06.2006.

  1. Tannah

    Tannah Grünschnabel

    Dabei seit:
    16.06.2006
    Beiträge:
    5
    Zustimmungen:
    0
    Grüß Euch!

    Obwohl ich die Suchfunktion bemüht habe, bin ich leider nicht schlauer geworden. Deshalb hoffe ich, ihr könnt mir helfen.

    Ich bin dabei, ein kleines Script zu schreiben, das zwei Verzeichnisse vergleichen und gleiche Dateien in ein Logfile schreiben soll.
    Den Grundstock habe ich, jedoch schaffe ich es nicht, dass die root-Verzeichnisse rekursiv durchgegangen werden. Deshalb an Euch nun meine Frage: Wie geht das?

    Hier mein Script:
    #!/bin/bash

    PATH=/bin:/usr/bin

    FIRSTPATH="/home/Jocka/Arbeiten/*"
    SECONDPATH="/Sicherung/Arbeiten/*"
    LOGFILE="/home/Jocka/Documents/Backup_HOWTO/Vergleich-Log"

    echo -n "Removing old log files..."
    if [ ! -e "$LOGFILE" ]
    then
    echo "No logfile present. Deleting old files skipped."
    else
    rm $LOGFILE 2> /dev/null
    if [ ! -e "$LOGFILE" ]
    then
    echo "Deletion complete."
    else
    echo "Error while deleting old logfiles."
    echo "Continue to compare anyway."
    fi
    fi

    echo "File comparison on $FIRSTPATH and $SECONDPATH" >> $LOGFILE
    echo "-------------------------------------------" >> $LOGFILE

    for path in $FIRSTPATH
    do
    for path1 in $SECONDPATH
    do
    FILE=${path##*/}
    FILE1=${path1##*/}
    if [ "$FILE" == "$FILE1" ]
    then
    if [ ! -d "$FILE" ]
    then
    echo $FILE1 >> $LOGFILE
    fi
    fi
    done
    done

    echo
    echo "System comparison complete, status: $?"

    exit

    P.S.: Eine weitere Frage noch. Da ich ein ziemlicher Anfänger mit Linux bin und die einzelnen Teile des Scripts teilweise aus dem Netz zusammengeflickt habe, wüßte ich gerne, welche Optionen es für Dateien gibt. "if [ -e ] zum Beispiel heißt "existiert", wenn ich mich nicht irre. Welche Optionen gibt es noch und was bedeuten sie?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 phrenicus, 17.06.2006
    phrenicus

    phrenicus Routinier

    Dabei seit:
    24.05.2006
    Beiträge:
    253
    Zustimmungen:
    0
    Ort:
    Tübingen, Germany
    Hallo Tannah,

    also wie man Dein Skript so umbaut, dass es rekursiv arbeitet, weiß ich auch nicht.
    Aber zum Verständnis:

    Code:
    [ -e $FILE ] ; 
    wird gelesen: "if test minus e $FILE"

    Lies mal das Manual zu test, man kann so ziemlich alles damit testen :-))

    Dein nachfolgendes Konstrukt würde ich etwas umbauen:
    Code:
    if [ "$FILE" = "$FILE1" ] -a [ ! -d $ "FILE" ] ; then
      echo $FILE1 >> $LOGFILE
    fi
    
    also: "falls FILE und FILE1 gleichen Inhalt haben UND FILE kein Directory ist, dann"

    damit sparst Du Dir einen Schleifendurchlauf.

    Gruß...
     
  4. #3 Xanti, 17.06.2006
    Zuletzt bearbeitet: 17.06.2006
    Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Hallo Tannah,

    Du könntest Dein Problem rekursiv lösen, wenn Du zum Beispiel den Pfad als Parameter einliest, den Pfad durchsuchst, Files vergleichst und bei Directories das Skript erneut aufrufst mit dem neuen Pfad als Parameter.

    Musst Dir aber nicht die Mühe machen, dafür gibts auch find.

    Dein Vergleichsteil

    Code:
    for path in $FIRSTPATH
    do
    for path1 in $SECONDPATH
    do
    FILE=${path##*/}
    FILE1=${path1##*/}
    if [ "$FILE" == "$FILE1" ]
    then
    if [ ! -d "$FILE" ]
    then
    echo $FILE1 >> $LOGFILE
    fi
    fi
    done
    done
    
    könnte dann z.B. so aussehen (ungeprüft)

    Code:
    cd "$FIRSTPATH"
    for i in $(find . -type f); do
      if [ -e "$SECONDPATH/$i" -a -z "$(diff -q $i $SECONDPATH/$i)" ]; then
        echo "$i" >> $LOGFILE
      fi
    done
    
    Hab ein diff noch eingebaut, das vergleicht die Files intern. Kannst Du natürlich rausnehmen.

    Gruss, Xanti
     
  5. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    Hallo zusammen

    Also wenn mich nicht alles täuscht, kann man mit 'diff' direkt ganze Verzeichnisse vergleichen. Musste auch mal so was machen, kann mich aber nicht mehr genau erinnern und hab das Script auch nicht grad hier...

    http://unixhelp.ed.ac.uk/utilities2/diff2.1.1.html

    Oder hab ich da was falsch verstanden...

    Gruss
    d22
     
  6. #5 phrenicus, 17.06.2006
    phrenicus

    phrenicus Routinier

    Dabei seit:
    24.05.2006
    Beiträge:
    253
    Zustimmungen:
    0
    Ort:
    Tübingen, Germany
    Nee, stimmt:

    Code:
    phrenicus@majestix:/tmp > diff -s BLA1/ BLA2/
    Dateien BLA1/blubb2 und BLA2/blubb2 sind identisch.
    
    Das geht :-)
     
  7. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  8. Tannah

    Tannah Grünschnabel

    Dabei seit:
    16.06.2006
    Beiträge:
    5
    Zustimmungen:
    0
    Danke für die Antworten. Echt super von Euch Leute. Habe Eure Codeschnippsel zwar noch nicht getestet, aber ich bin mir sicher, daß die funktionieren werden.

    @phrenicus
    Danke für den Tipp mit test. Ich wußte, daß ich es irgendwo schon mal gelesen habe...
    Auch die Sache, daß ich mir die zweite if-Abfrage sparen könnte, war mir klar, nur habe ich es sytaktisch nicht hingekriegt.

    @all
    Ich bin mir schon klar, daß es einfachere Wege gibt, meine Aufgabe zu lösen (mal ganz abgesehen von dem Programm dirdiff). Doch einerseits bin ich begeisterter Hobby-Programmierer :-) und andrerseits kann man ein eigenes Skript genau seinen Wünschen anpassen. So ist mir zum Beispiel die Ausgabe von dirdiff viel zu unspezifisch und mit der Syntax von diff komme ich immer noch nicht ganz klar.

    Also danke nochmal an alle. Sollte ich nochmal Probleme haben, komme ich wieder :brav:
     
  9. mic86

    mic86 Jungspund

    Dabei seit:
    02.05.2007
    Beiträge:
    11
    Zustimmungen:
    0
    rekursiv Dateien durchforsten

    Bin gerade auf diesen thread gestoßen, da ich auch dabei bin ein BASH-Skript zu schreiben, dass Verzeichnisse durchforstet und Dateien vergleichen soll.
    Das mit dem durchforsten habe ich rekursiv so gelöst:

    Code:
    #!/bin/bash
    direct() {		#schnüffelt in jeden ordner rein, der gefunden wird und zu dem zugriffsrechte bestehen
    	for i in * ; 
    		do 
    		if [ -d $i ]; then 
    			cd $i &&
    			echo "$i" &&
    			direct &&
    			cd .. ;
    		fi ; 		
    	done
    	
    }
    direct;
    
     
Thema:

verzeichnisse vergleichen

Die Seite wird geladen...

verzeichnisse vergleichen - Ähnliche Themen

  1. Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen

    Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen: Hallo, ich habe ein Verzeichnis, darin enthalten sind mehrere Dateien. Nun möchte ich alle Dateien (Parameter $1) gegen eine konstante Datei...
  2. zwei Verzeichnisse bidirektional vergleichen

    zwei Verzeichnisse bidirektional vergleichen: Hi! Ich möchte zwei Verzeichnisbäume (Verzeichnisse samt Unterverzeichnissen) bzw. die enthaltenen Dateien miteinander vergleichen. Wichtig ist...
  3. verzeichnisse vergleichen mit welchem Kommando

    verzeichnisse vergleichen mit welchem Kommando: Hallo, mit welchem Kommando kann ich Verzeichnisse vergleichen? diff kenne ich schon, vergleicht leider nur Dateien.
  4. Cryptomator: Transparente Verschlüsselung für Cloud-Verzeichnisse

    Cryptomator: Transparente Verschlüsselung für Cloud-Verzeichnisse: Das freie Programm Cryptomator, dessen Version 1.0 kurz bevorsteht, soll für eine einfache, sichere und transparente Verschlüsselung von...
  5. Verschieben des Steam-Datenverzeichnisses kann zu komplettem Datenverlust führen

    Verschieben des Steam-Datenverzeichnisses kann zu komplettem Datenverlust führen: Benutzer, die das Steam-Datenverzeichnis an eine andere Stelle verschoben haben, laufen aufgrund eines Programmierfehlers Gefahr, alle ihre Daten...