1. Startseite
  2. Dateisystem
  3. In der Bash prüfen, ob eine Datei oder ein Verzeichnis existiert

In der Bash prüfen, ob eine Datei oder ein Verzeichnis existiert

Wenn du gerade dabei bist, Shell-Skripte zu schreiben, stehst du oft vor der Herausforderung, zu prüfen, ob eine Datei existiert oder nicht, bevor du eine bestimmte Aktion ausführst.

In der Bash kannst du den Befehl test verwenden, um dies zu tun. Der Befehl test hat eine der folgenden Syntaxformen:

test AUSDRUCK
[ AUSDRUCK ]
[[ AUSDRUCK ]]

Wenn du sicherstellen möchtest, dass dein Skript portabel ist, solltest du den alten test-Befehl [ verwenden, der in allen POSIX-Shells verfügbar ist. Die neuere und verbesserte Version des test-Befehls [[ (mit doppelten Klammern) wird jedoch von den meisten modernen Systemen unterstützt, die Bash, Zsh und Ksh als Standardshell verwenden.

Prüfen, ob eine Datei existiert

Wenn du überprüfen möchtest, ob eine Datei existiert, sind die häufigsten verwendeten FILE-Operatoren -e und -f. Ersteres überprüft, ob eine Datei unabhängig von ihrem Typ existiert, während letzteres nur dann true zurückgibt, wenn es sich bei der Datei um eine reguläre Datei handelt (kein Verzeichnis oder Gerät).

Die lesbarste Option, um dies zu tun, ist die Verwendung des test-Befehls in Kombination mit der Anweisung if. Hier sind einige Beispiele, die zeigen, wie du prüfen kannst, ob die Datei /etc/resolv.conf existiert:

DATEI=/etc/resolv.conf
if test -f "$DATEI"; then
	echo "$DATEI existiert."
fi
DATEI=/etc/resolv.conf
if [ -f "$DATEI" ]; then
	echo "$DATEI existiert."
fi
DATEI=/etc/resolv.conf
if [[ -f "$DATEI" ]]; then
	echo "$DATEI existiert."
fi

Wenn du basierend darauf unterschiedliche Aktionen ausführen möchtest, je nachdem, ob die Datei existiert oder nicht, kannst du das if/then-Konstrukt verwenden:

DATEI=/etc/resolv.conf
if [ -f "$DATEI" ]; then
	echo "$DATEI existiert."
else 
	echo "$DATEI existiert nicht."
fi

Es ist immer ratsam, doppelte Anführungszeichen zu verwenden, um Probleme zu vermeiden, insbesondere bei Dateinamen mit Leerzeichen.

Du kannst den Testbefehl auch ohne die if-Anweisung verwenden. Der Befehl nach dem &&-Operator wird nur ausgeführt, wenn der Exit-Status des Testbefehls true ist,

test -f /etc/resolv.conf && echo "$DATEI existiert."
[ -f /etc/resolv.conf ] && echo "$DATEI existiert."
[[ -f /etc/resolv.conf ]] && echo "$DATEI existiert."

Wenn du eine Reihe von Befehlen nach dem &&-Operator ausführen möchtest, schließe die Befehle einfach in geschweifte Klammern ein, getrennt durch ; oder &&:

[ -f /etc/resolv.conf ] && { echo "$DATEI existiert."; cp "$DATEI" /tmp/; }

Im Gegensatz dazu wird die Anweisung nach dem ||-Operator nur ausgeführt, wenn der Exit-Status des Testbefehls false ist.

[ -f /etc/resolv.conf ] || echo "$DATEI existiert nicht."

Prüfen, ob ein Verzeichnis existiert

Mit dem Operator -d kannst du überprüfen, ob eine Datei ein Verzeichnis ist oder nicht.

Um zum Beispiel zu prüfen, ob das Verzeichnis /etc/docker existiert, würdest du Folgendes verwenden:

DATEI=/etc/docker
if [ -d "$DATEI" ]; then
	echo "$DATEI ist ein Verzeichnis."
fi
[ -d /etc/docker ] echo "$DATEI ist ein Verzeichnis."

Du kannst auch die doppelten Klammern [[ statt der einfachen [ verwenden.

Prüfen, ob die Datei nicht existiert

Wie in vielen anderen Sprachen auch, kann der Prüfausdruck mit dem logischen Nicht-Operator ! (Ausrufezeichen) negiert werden:

DATEI=/etc/docker
if [ ! -f "$DATEI" ]; then
	echo "$DATEI existiert nicht."
fi
[ ! -f /etc/docker ] echo "$DATEI existiert nicht."

Prüfen, ob mehrere Dateien vorhanden sind

Anstatt komplizierte verschachtelte if/else-Konstrukte zu verwenden, kannst du -a (oder && mit [[) verwenden, um zu testen, ob mehrere Dateien existieren:

if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
	echo "Beide Dateien existieren."
fi
if [[ -f /etc/resolv.conf -f /etc/hosts ]]; then
	echo "Beide Dateien existieren."
fi

Entsprechende Varianten ohne Verwendung der IF-Anweisung:

[ -f /etc/resolv.conf -a -f /etc/hosts ] echo "Beide Dateien exist

ieren."
[[ -f /etc/resolv.conf -f /etc/hosts ]] echo "Beide Dateien existieren."

Datei-Testoperatoren

Der Befehl test enthält verschiedene FILE-Operatoren, mit denen du auf bestimmte Dateitypen testen kannst:

  • -b DATEI – Wahr, wenn die DATEI existiert und eine spezielle Blockdatei ist.
  • -c DATEI – Wahr, wenn die DATEI existiert und eine spezielle Zeichendatei ist.
  • -d DATEI – Wahr, wenn die DATEI existiert und ein Verzeichnis ist.
  • -e DATEI – Wahr, wenn die DATEI existiert und eine Datei ist, unabhängig vom Typ (Knoten, Verzeichnis, Socket, etc.).
  • -f DATEI – Wahr, wenn die DATEI existiert und eine normale Datei ist (kein Verzeichnis oder Gerät).
  • -G DATEI – Wahr, wenn die DATEI existiert und die gleiche Gruppe hat wie der Benutzer, der den Befehl ausführt.
  • -h DATEI – Wahr, wenn die DATEI existiert und ein symbolischer Link ist.
  • -g DATEI – Wahr, wenn die DATEI existiert und das Flag set-group-id (sgid) gesetzt ist.
  • -k DATEI – Wahr, wenn die DATEI existiert und ein Sticky-Bit-Flag gesetzt ist.
  • -L DATEI – Wahr, wenn die DATEI existiert und ein symbolischer Link ist.
  • -O DATEI – Wahr, wenn die DATEI existiert und dem Benutzer gehört, der den Befehl ausführt.
  • -p DATEI – Wahr, wenn die DATEI existiert und eine Pipe ist.
  • -r DATEI – Wahr, wenn die DATEI existiert und lesbar ist.
  • -S DATEI – Wahr, wenn die DATEI existiert und ein Socket ist.
  • -s DATEI – Wahr, wenn die DATEI existiert und eine Größe ungleich Null hat.
  • -u DATEI – Wahr, wenn die DATEI existiert und das Flag set-user-id (suid) gesetzt ist.
  • -w DATEI – Wahr, wenn die DATEI existiert und beschreibbar ist.
  • -x DATEI – Wahr, wenn die DATEI existiert und ausführbar ist.

Zusammenfassung

In dieser Anleitung haben wir dir gezeigt, wie du in der Bash überprüfen kannst, ob eine Datei oder ein Verzeichnis existiert.

Falls du Fragen oder Feedback hast, hinterlasse gerne einen Kommentar.

War dieser Beitrag hilfreich?

Verwandte Beiträge