verzeichnisse vergleichen

T

Tannah

Grünschnabel
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?
 
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:
if [ "$FILE" == "$FILE1" ]
then
if [ ! -d "$FILE" ]
then
echo $FILE1 >> $LOGFILE
fi
fi

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ß...
 
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
 
Zuletzt bearbeitet:
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
 
Nee, stimmt:

Code:
phrenicus@majestix:/tmp > diff -s BLA1/ BLA2/
Dateien BLA1/blubb2 und BLA2/blubb2 sind identisch.

Das geht :-)
 
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:
 
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;
 

Ähnliche Themen

Switche abfragen über Script

NAS-Drive Mount in Bash-Script über crontab

script sshpass

Verschlüsseltes Backup-Script mit rsync

HandbrakeCLI Shell Skript

Zurück
Oben