BASH-Befehl: Dateien auf Existenz prüfen

Prüfung auf Existenz einer Datei mit dem Befehl [

Wenn du prüfen möchtest, ob eine Datei existiert, kannst du den Befehl [ verwenden. Dieser Befehl nimmt einen Pfad zu einer Datei als Argument und gibt einen Exit-Status zurück:

  • 0, wenn die Datei existiert
  • 1, wenn die Datei nicht existiert

Syntax:

[ -f /Pfad/zur/Datei ]

Beispiel:

[ -f /home/benutzer/datei.txt ]

Fragen und Antworten:

Wie kann ich den Exit-Status des Befehls [ überprüfen?

Den Exit-Status eines Befehls kannst du mit dem Befehl echo $? abfragen. Dieser Befehl gibt den Exit-Status des zuletzt ausgeführten Befehls zurück.

Was passiert, wenn der Pfad zur Datei falsch ist?

Wenn der Pfad zur Datei falsch ist, gibt der Befehl [ den Exit-Status 1 zurück.

Welche Sonderzeichen sind im Pfad zur Datei zulässig?

Im Pfad zur Datei sind alle Zeichen zulässig, außer dem Zeilenumbruch.

Kann ich Platzhalter im Pfad zur Datei verwenden?

Ja, du kannst Platzhalter im Pfad zur Datei verwenden, um mehrere Dateien auf einmal zu prüfen. Beispielsweise prüft der folgende Befehl, ob eine Datei mit dem Namen datei.* existiert:

[ -f /home/benutzer/datei.* ]

Verwendung von Platzhaltern für die Dateibenennung

Platzhalterzeichen ermöglichen es dir, bei der Prüfung auf die Existenz einer Datei eine ganze Gruppe von Dateien anhand eines allgemeinen Namensmusters zu berücksichtigen. Dies ist nützlich, wenn du dir nicht sicher bist, wie die genaue Dateibenennung lautet, oder wenn du eine Reihe ähnlicher Dateien prüfen möchtest.

Globale Platzhalter

Die folgenden Platzhalterzeichen werden von der Bash-Shell unterstützt und können in Verbindung mit dem Befehl [ verwendet werden:

  • *: Passt zu jeder beliebigen Zeichenfolge, einschließlich leerer Zeichenfolgen.
  • ?: Passt zu jedem einzelnen Zeichen.
  • []: Passt zu einem beliebigen Zeichen innerhalb der eckigen Klammern. Beispiel: [0-9] findet alle Dateien, deren Namen mit einer Zahl beginnen.

Beispiele

Nehmen wir an, du möchtest prüfen, ob eine Datei mit dem Namen text* existiert. Folgender Befehl würde dies tun:

[ -e text* ]

Wenn es eine Datei mit einem Namen gibt, der mit text beginnt, gibt der Befehl true zurück, andernfalls false.

Du kannst Platzhalter auch verwenden, um eine ganze Gruppe von Dateien zu prüfen. Beispielsweise würde folgender Befehl prüfen, ob eine Datei mit der Endung .txt existiert:

[ -e *.txt ]

Vorsichtsmaßnahmen

Bei der Verwendung von Platzhaltern solltest du Folgendes beachten:

  • Achte darauf, die Platzhalterzeichen ordnungsgemäß zu escapen, wenn sie in einem regulären Ausdruck verwendet werden.
  • Überprüfe die Ergebnisse sorgfältig, da Platzhalterzeichen unerwartete Übereinstimmungen verursachen können.
  • Vermeide es, Platzhalter für Dateinamen mit Sonderzeichen oder Leerzeichen zu verwenden.

Prüfung auf Existenz mehrerer Dateien

Solltest du die Existenz mehrerer Dateien überprüfen wollen, kannst du den Befehl find einsetzen. find durchsucht ein Verzeichnis (oder mehrere Verzeichnisse) nach bestimmten Kriterien. Um nach mehreren Dateien zu suchen, kannst du Platzhalter verwenden, wie z.B. * (jedes Zeichen) oder ? (ein einzelnes Zeichen).

Verwendung von Platzhaltern

Um beispielsweise zu prüfen, ob alle Dateien mit der Endung .txt im aktuellen Verzeichnis existieren, verwendest du folgenden Befehl:

find . -name "*.txt"

Dabei durchsucht find das aktuelle Verzeichnis (-name) nach Dateien, deren Name der Endung .txt entspricht.

Umgang mit Sonderfällen

Bei der Suche nach mehreren Dateien musst du einige Sonderfälle berücksichtigen:

  • Versteckte Dateien: Um auch versteckte Dateien einzubeziehen, verwende die Option -ls. Beispiel: find . -ls -name "*.txt"

  • Sonderzeichen: Wenn Dateinamen Sonderzeichen enthalten (z.B. Leerzeichen), musst du sie mit Anführungszeichen umschließen: `find . -name ""file mit Leerzeichen.txt"„

  • Lange Dateinamen: Falls du sehr lange Dateinamen hast, kannst du die Option -maxdepth verwenden, um die Suchtiefe zu beschränken: find . -maxdepth 1 -name "*.txt"

Umgang mit leeren Dateien

Leere Dateien können für dich eine Herausforderung darstellen, wenn du ihre Existenz prüfen willst. Das liegt daran, dass der Befehl [ -f ] zwar prüft, ob eine Datei existiert, aber nicht feststellt, ob sie leer ist.

Prüfung auf Leere mit `stat`

Um zu prüfen, ob eine Datei leer ist, kannst du den Befehl stat verwenden. Die Option --printf ermöglicht es dir, bestimmte Informationen über die Datei abzurufen, darunter auch ihre Größe:

$ stat --printf="%s" datei.txt
5

Im obigen Beispiel hat datei.txt eine Größe von 5 Byte. Wenn die Datei leer ist, gibt stat eine Größe von 0 zurück:

$ stat --printf="%s" leere_datei.txt
0

Verwendung des Befehls `test`

Eine weitere Möglichkeit, leere Dateien zu prüfen, ist der Befehl test. Mit der Option -s kannst du prüfen, ob eine Datei eine Größe ungleich Null hat:

$ test -s datei.txt
$ echo $?
0

Der Befehl test gibt den Rückgabewert 1 zurück, wenn die Datei leer ist, und 0, wenn sie eine Größe ungleich Null hat.

Sonderfall: Ausgeblendete Dateien

Wenn du mit ausgeblendeten Dateien arbeitest, musst du möglicherweise die Option -a mit find verwenden. Diese Option weist find an, auch versteckte Dateien einzuschließen:

$ find ./ -type f -name ".hidden_file"
./.hidden_file

Prüfung auf Existenz von Verzeichnissen

Wenn du wissen möchtest, ob ein Verzeichnis existiert, kannst du den Befehl [ -d ] verwenden. Die Syntax lautet:

[ -d VERZEICHNIS ]

Dabei ist VERZEICHNIS der Pfad zum Verzeichnis, auf dessen Existenz du prüfen möchtest.

Zurückgabewerte

Der Befehl gibt einen von zwei Rückgabewerten zurück:

  • 0, wenn das Verzeichnis existiert
  • 1, wenn das Verzeichnis nicht existiert

Verwendung

Um beispielsweise zu prüfen, ob das Verzeichnis /home/benutzer/Dokumente existiert, würdest du folgenden Befehl ausführen:

[ -d /home/benutzer/Dokumente ]

Platzierhalter

Du kannst auch Platzhalter verwenden, um auf mehrere Verzeichnisse zu prüfen. Beispielsweise prüft der folgende Befehl, ob die Verzeichnisse /home/benutzer/Dokumente und /home/benutzer/Bilder existieren:

[ -d /home/benutzer/{Dokumente,Bilder} ]

Umgang mit leeren Verzeichnissen

Der Befehl [ -d ] prüft nur auf die Existenz eines Verzeichnisses, unabhängig davon, ob es leer ist oder nicht. Wenn du prüfen möchtest, ob ein Verzeichnis nicht leer ist, kannst du den Befehl [ -n ] verwenden. Die Syntax lautet:

[ -n VERZEICHNIS ]

Codebeispiel

Hier ist ein Codebeispiel, in dem geprüft wird, ob das Verzeichnis /home/benutzer/Dokumente existiert und nicht leer ist:

if [ -d /home/benutzer/Dokumente ] && [ -n /home/benutzer/Dokumente ]; then
  # Das Verzeichnis existiert und ist nicht leer
else
  # Das Verzeichnis existiert nicht oder ist leer
fi

Prüfung auf Existenz von Links

Links sind Verweise auf andere Dateien oder Verzeichnisse. Überprüfe mithilfe des BASH-Befehls -L, ob es sich bei einer bestimmten Datei um einen Link handelt:

Verwendung von -L

Führe den folgenden Befehl aus, um zu prüfen, ob link.txt ein Link ist:

[ -L link.txt ] && echo "Ist ein Link" || echo "Ist kein Link"

Platzhalter für Dateinamen

Du kannst Platzhalter verwenden, um mehrere Links zu prüfen. Beispielsweise überprüft dieser Befehl alle .txt-Dateien im Verzeichnis Dokumente:

find /Dokumente -name '*.txt' -type l -print

Umgang mit leeren Links

Leere Links verweisen auf keine andere Datei oder kein Verzeichnis. Du kannst sie mit dem folgenden Befehl prüfen:

[ -L link.txt -a ! -s link.txt ] && echo "Leerer Link"

Sonderfälle

Beachte folgende Sonderfälle:

  • Versteckte Dateien: Verwende find mit der Option -xdev für versteckte Dateien.
  • Sonderzeichen: Escape Sonderzeichen in Dateinamen mit \.
  • Lange Dateinamen: Verwende Anführungszeichen um Dateinamen mit Leerzeichen oder Sonderzeichen.

Codebeispiele

Beispiel 1: Prüfung auf einen einzelnen Link

if [ -L "link.txt" ]; then
  echo "link.txt ist ein Link"
fi

Beispiel 2: Prüfung auf mehrere Links in einem Verzeichnis

for file in /Dokumente/*.txt; do
  if [ -L "$file" ]; then
    echo "$file ist ein Link"
  fi
done

Sonderfälle: Versteckte Dateien, Sonderzeichen, lange Dateinamen

Versteckte Dateien

Versteckte Dateien werden unter Linux und macOS mit einem Punkt (.) am Anfang des Dateinamens gekennzeichnet. Um diese Dateien in deiner Prüfung einzubeziehen, musst du den Pfad zur Datei mit dem Präfix "." angeben. Beispiel:

if [ -f ./.versteckteDatei ]; then
  echo "Versteckte Datei gefunden"
fi

Sonderzeichen

Sonderzeichen wie Leerzeichen, Tabs und Sonderzeichen können in Dateinamen vorkommen. Um diese Zeichen in deiner Prüfung zu berücksichtigen, musst du den Dateinamen in Anführungszeichen setzen. Beispiel:

if [ -f "datei mit Sonderzeichen.txt" ]; then
  echo "Datei mit Sonderzeichen gefunden"
fi

Lange Dateinamen

Wenn Dateinamen länger als 255 Zeichen sind, kannst du sie nicht mit der einfachen [ -f ]-Prüfung testen. In diesem Fall musst du die GNU-Erweiterung [ -e ] verwenden, die auch lange Dateinamen unterstützt. Beispiel:

if [ -e "sehr_langer_Dateiname_mit_mehr_als_255_Zeichen.txt" ]; then
  echo "Lange Datei gefunden"
fi

Codebeispiele für gängige Szenarien

Prüfung auf Existenz einer Datei

if [ -f /pfad/zur/datei ]; then
  # Datei existiert
else
  # Datei existiert nicht
fi

Verwendung von Platzhaltern für die Dateibenennung

if [ -f "/pfad/zur/*.txt" ]; then
  # Mindestens eine TXT-Datei im angegebenen Pfad existiert
else
  # Keine TXT-Datei im angegebenen Pfad gefunden
fi

Prüfung auf Existenz mehrerer Dateien

for datei in datei1 datei2 datei3; do
  if [ -f "/pfad/zur/$datei" ]; then
    # Datei existiert
  else
    # Datei existiert nicht
  fi
done

Umgang mit leeren Dateien

if [ -s /pfad/zur/datei ]; then
  # Datei ist nicht leer
else
  # Datei ist leer oder existiert nicht
fi

Prüfung auf Existenz von Verzeichnissen

if [ -d /pfad/zum/verzeichnis ]; then
  # Verzeichnis existiert
else
  # Verzeichnis existiert nicht
fi

Prüfung auf Existenz von Links

if [ -L /pfad/zum/link ]; then
  # Link existiert
else
  # Link existiert nicht
fi

Sonderfälle: Versteckte Dateien, Sonderzeichen, lange Dateinamen

Versteckte Dateien

if [ -f ~/.versteckteDatei ]; then
  # Versteckte Datei existiert
fi

Sonderzeichen

if [ -f "/pfad/zur/datei mit Leerzeichen" ]; then
  # Datei mit Leerzeichen im Namen existiert
fi

Lange Dateinamen

if [ -f "/pfad/zur/sehr langen Datei mit mehr als 255 Zeichen im Namen" ]; then
  # Datei mit langem Namen existiert
fi