Compadir

#!/usr/bin/env bash

# Funktion für die usage-Anzeige
usage() {
    echo "Verwendung: $0 <Pfad_Ordner1> <Pfad_Ordner2> [Ausgabedatei]"
    exit 1
}

# Überprüfung der Argumente (mindestens 2, maximal 3)
if [ $# -lt 2 ] || [ $# -gt 3 ]; then
    usage
fi

DIR1="$1"
DIR2="$2"
OUTPUT_FILE="${3:-}" # Drittes Argument ist optional

# Validierung der Verzeichnisse
if [ ! -d "$DIR1" ]; then
    echo "Fehler: '$DIR1' ist kein gültiges Verzeichnis."
    exit 1
fi

if [ ! -d "$DIR2" ]; then
    echo "Fehler: '$DIR2' ist kein gültiges Verzeichnis."
    exit 1
fi

# Befehlszusammensetzung
# Wir nutzen eine Variable für den Befehl, um die Umleitung dynamisch zu gestalten
CMD="diff -rq"

if [ -n "$OUTPUT_FILE" ]; then
    # Wenn eine Datei angegeben ist, leite Ausgabe dorthin um (und optional auch auf stdout mit tee)
    # Hier: Nur in Datei umleiten (leiser Modus für Terminal)
    echo "Vergleich läuft... Ergebnis wird in '$OUTPUT_FILE' gespeichert."
    if $CMD "$DIR1" "$DIR2" > "$OUTPUT_FILE"; then
        echo "Ergebnis: Die Verzeichnisse sind identisch."
        echo "(Keine Unterschiede in die Datei geschrieben)"
    else
        echo "Ergebnis: Unterschiede festgestellt und in '$OUTPUT_FILE' gespeichert."
    fi
else
    # Keine Datei angegeben: normale Ausgabe auf dem Terminal
    if $CMD "$DIR1" "$DIR2"; then
        echo "Ergebnis: Die Verzeichnisse sind identisch."
    else
        echo "Ergebnis: Es wurden Unterschiede festgestellt (siehe Ausgabe oben)."
    fi
fi

Funktionsweise & Optionen

  • Erforderliche Argumente: Das Skript erwartet zwingend zwei Argumente ($1 und $2). Wenn diese fehlen, wird eine usage-Nachricht ausgegeben. 
  • Optionales Argument: ${3:-} weist der Variable OUTPUT_FILE den dritten Parameter zu. Fehlt dieser, bleibt die Variable leer.
  • Validierung:  Dem Vergleich vorangestellte Prüfung, ob beide Pfade existent und valide Verzeichnisse sind.
  • Befehl: Der Kernbefehl ist diff -rq.
    • -r sorgt für den rekursiven Abgleich von Unterordnern.
    • -q unterdrückt die detaillierte Anzeige der Zeilenunterschiede und meldet nur, dass eine Datei abweicht oder fehlt.
  • Rückgabewert (Exit Code):
    • 0: Die Verzeichnisse sind inhaltlich gleich.
    • 1: Es gibt Unterschiede.
    • Ermöglicht die Nutzung des Skripts in weiteren Automatisierungen (z. B. in CI/CD-Pipelines). 
    • Zur Anzeige detaillierter Unterschiede anstelle nur der reinen Meldung ist das -q im Befehl diff -rq zu entfernen.
  • Bedingte Umleitung:
    • Mit Datei: diff ... > "$OUTPUT_FILE" schreibt die Unterschiede direkt in die Datei. Das Terminal bleibt sauber und zeigt nur eine Zusammenfassung.
    • Ohne Datei: Die Ausgabe erfolgt wie gewohnt auf stdout (dem Terminal).

    Verwendung

    • Verwendung:
      • Nur Terminal: ./skriptname.sh /pfad/zu/ordner1 /pfad/zu/ordner2
      • Mit Datei: ./skriptname.sh /pfad/zu/ordner1 /pfad/zu/ordner2 unterschiede.txt