GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in Bash vorhanden ist

Beim Schreiben von Shell-Skripten befinden Sie sich oft in einer Situation, in der Sie eine Aktion ausführen müssen, die darauf basiert, ob eine Datei vorhanden ist oder nicht.

In Bash können Sie mit dem Test-Befehl prüfen, ob eine Datei existiert und den Typ der Datei bestimmen.

Der Testbefehl nimmt eine der folgenden Syntaxformen an:

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

Wenn Sie möchten, dass Ihr Skript portabel ist, sollten Sie lieber den alten Test [ verwenden Befehl, der auf allen POSIX-Shells verfügbar ist. Die neue aktualisierte Version des Testbefehls [[ (doppelte Klammern) wird auf den meisten modernen Systemen unterstützt, die Bash, Zsh und Ksh als Standard-Shell verwenden.

Überprüfen Sie, ob die Datei existiert #

Beim Prüfen, ob eine Datei existiert, sind die am häufigsten verwendeten FILE-Operatoren -e und -f . Die erste überprüft, ob eine Datei unabhängig vom Typ existiert, während die zweite nur dann wahr zurückgibt, wenn die DATEI eine normale Datei ist (kein Verzeichnis oder Gerät).

Die am besten lesbare Option zum Prüfen, ob eine Datei existiert oder nicht, ist die Verwendung des test Befehl in Kombination mit dem if Erklärung. Jedes der folgenden Snippets überprüft, ob die Datei /etc/resolv.conf Datei existiert:

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

Wenn Sie abhängig davon, ob die Datei existiert oder nicht, eine andere Aktion ausführen möchten, verwenden Sie einfach das if/then-Konstrukt:

FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE exists."
else 
    echo "$FILE does not exist."
fi
Verwenden Sie immer doppelte Anführungszeichen, um Probleme beim Umgang mit Dateien zu vermeiden, die Leerzeichen in ihren Namen enthalten.

Sie können den Testbefehl auch ohne die if-Anweisung verwenden. Der Befehl nach dem && Der Operator wird nur ausgeführt, wenn der Exit-Status des Testbefehls wahr ist,

test -f /etc/resolv.conf && echo "$FILE exists."
[ -f /etc/resolv.conf ] && echo "$FILE exists."
[[ -f /etc/resolv.conf ]] && echo "$FILE exists."

Wenn Sie nach dem && eine Reihe von Befehlen ausführen möchten schließen Sie die Befehle einfach in geschweifte Klammern ein, die durch ; getrennt sind oder && :

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

Gegenteil von && , die Anweisung nach || -Operator wird nur ausgeführt, wenn der Exit-Status des Testbefehls false ist .

[ -f /etc/resolv.conf ] && echo "$FILE exist." || echo "$FILE does not exist."

Überprüfen Sie, ob das Verzeichnis existiert #

Die Operatoren -d ermöglicht Ihnen zu testen, ob eine Datei ein Verzeichnis ist oder nicht.

Um beispielsweise zu prüfen, ob die Datei /etc/docker Verzeichnis vorhanden, das Sie verwenden würden:

FILE=/etc/docker
if [ -d "$FILE" ]; then
    echo "$FILE is a directory."
fi
[ -d /etc/docker ] && echo "$FILE is a directory."

Sie können auch die doppelten Klammern [[ verwenden statt einem einzigen [ .

Überprüfen, ob Datei nicht existiert #

Ähnlich wie in vielen anderen Sprachen kann der Testausdruck mit ! negiert werden (Ausrufezeichen) logischer Nicht-Operator:

FILE=/etc/docker
if [ ! -f "$FILE" ]; then
    echo "$FILE does not exist."
fi

Wie oben:

[ ! -f /etc/docker ] && echo "$FILE does not exist."

Überprüfen, ob mehrere Dateien existieren #

Anstatt komplizierte verschachtelte if/else-Konstrukte zu verwenden, können Sie -a verwenden (oder && mit [[ ), um zu testen, ob mehrere Dateien vorhanden sind:

if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then
    echo "Both files exist."
fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then
    echo "Both files exist."
fi

Äquivalente Varianten ohne Verwendung der IF-Anweisung:

[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."

Dateitestoperatoren #

Der Testbefehl enthält die folgenden FILE-Operatoren, mit denen Sie auf bestimmte Dateitypen testen können:

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

Schlussfolgerung #

In dieser Anleitung haben wir Ihnen gezeigt, wie Sie überprüfen können, ob eine Datei oder ein Verzeichnis in Bash existiert.

Wenn Sie Fragen oder Feedback haben, können Sie gerne einen Kommentar hinterlassen.


Linux
  1. So überprüfen Sie die Syntax von Sudoers

  2. Wie überprüfe ich die Teilzeichenfolge in Shell Script Bash?

  3. Wie kann ich überprüfen, ob eine Datei vorhanden ist, und einen Befehl ausführen, wenn dies nicht der Fall ist?

  4. Überprüfen Sie, ob ein bestimmter Dateityp/eine bestimmte Erweiterung im Verzeichnis vorhanden ist

  5. Wie parse ich eine CSV-Datei in Bash?

Ansible:Prüfen, ob eine Datei existiert

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in Bash vorhanden ist

So lesen Sie Dateien Zeile für Zeile in Bash

So lesen Sie eine Datei Zeile für Zeile in Bash

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in der Bash-Shell vorhanden ist

Wie kann ich überprüfen, ob ein Verzeichnis existiert?