So überprüfen Sie ordnungsgemäß, ob eine Datei in Bash oder Shell vorhanden ist (mit Beispielen)
Inhaltsverzeichnis
In diesem Tutorial werde ich verschiedene Attribute behandeln, die Sie in Bash- oder Shell-Skripten verwenden können, um Dateien und Verzeichnisse zu überprüfen. Sie können basale bedingte Ausdrücke mit ]
verwenden oder test mit verwenden, um zu überprüfen, ob eine Datei vorhanden ist.
Wir werden Verwenden Sie den Operator bash if und else für alle Beispiele, daher würde ich Ihnen empfehlen, Folgendes zu lesen: Bash if else-Gebrauchsanweisung für absolute Anfänger
1. Bash / Shell: Überprüfen Sie, ob eine Datei vorhanden ist und eine reguläre Datei
In diesem Abschnitt werden Beispiele gezeigt, mit denen überprüft werden kann, ob in Bash eine reguläre Datei vorhanden ist.
1.1: Methode 1: Verwenden von einfachen oder doppelten Klammern
Verwenden von doppelten Klammern ]
#!/bin/bashFILE="/etc/passwd"if ];then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
Verwenden einzelner Klammern
#!/bin/bashFILE="/etc/passwd"if ;then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
1.2: Methode 2: Verwenden des Testbefehls
test
wird zum Überprüfen und Vergleichen von Dateitypen verwendet Werte.
#!/bin/bashFILE="/etc/passwd"if test -f $FILE; then echo "$FILE exists"else echo "$FILE missing"fi
1.3: Methode 3: Einzeilige Zeile
In diesem Beispiel können hier einfache oder doppelte Klammern verwendet werden. Ich würde empfehlen, immer doppelte Klammern zu verwenden, wenn Sie einen Liner-Code in die Shell schreiben, da dies das Risiko minimiert, dass beim Aufteilen von Wörtern Warnungen auf der Konsole angezeigt werden.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists" || echo "$FILE missing"
Die Anweisung nach &&
wird ausgeführt, wenn ERFOLGREICH ist. Wenn die erste Bedingung FALSE zurückgibt, wird die Anweisung mit ||
ausgeführt.
Überprüfen Sie in ähnlicher Weise mit dem Befehl test, ob eine reguläre Datei in Bash- oder Shell-Skript in einer Zeile vorhanden ist
#!/bin/bashFILE="/etc/passwd"test -f $FILE && echo "$FILE exists" || echo "$FILE missing"
2. Bash / Shell: Überprüfen Sie, ob eine Datei vorhanden ist (leer oder nicht leer ist).
Überprüfen Sie, ob die Datei vorhanden ist und wenn es leer ist oder Inhalt hat, verwenden wir das Attribut „-s
“
2.1: Methode 1: Verwenden von einfachen oder doppelten Klammern
Überprüfen Sie in doppelten Klammern, ob eine Datei vorhanden und leer oder nicht leer ist. ]
#!/bin/bashFILE="/etc/passwd"if ]; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
Überprüfen Sie, ob die Datei vorhanden ist existiert und ist leer oder nicht leer in doppelten Klammern
if ; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
2.2: Methode 2: Verwenden des Testbefehls
Verwenden des Testbefehls kombinieren wir das Attribut -s
, um zu überprüfen, ob Datei existiert und ist leer oder hat einen Inhalt:
2.3: Methode 3: Einzeilige
Wir können sowohl doppelte als auch einfache Klammern für einen solchen Liner verwenden, aber wie ich bereits sagte, würde ich die Verwendung von doppelten Klammern empfehlen.
#!/bin/bashFILE="/etc/passwd"test -s $FILE && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
In ähnlicher Weise können wir mit dem Testbefehl &&
und ||
verwenden Operator zum Überprüfen der Datei in einzeiligen Befehlen in unserem Shell-Skript.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
3. Bash / Shell: Überprüfen Sie, ob ein Verzeichnis vorhanden ist
Ich hoffe, Sie wissen, dass unter Linux alles eine Datei ist. Auf diese Weise wird ein Verzeichnis auch als Datei betrachtet. Wir können das Attribut „-d
“ verwenden, um zu überprüfen, ob in der Shell-Programmierung ein Verzeichnis vorhanden ist.
3.1: Methode 1: Verwenden von doppelten oder einfachen Klammern
Wir können das Attribut -d
in einfachen
oder doppelten Klammern ]
verwenden, um dies zu überprüfen Wenn ein Verzeichnis vorhanden ist.
#!/bin/bashDIR="/var/log"if ]; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
In diesem Beispiel verwenden wir einzelne Klammern, um zu überprüfen, ob das Verzeichnis im Shell-Skript voreingestellt ist.
#!/bin/bashDIR="/var/log"if ; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.2: Methode 2: Verwenden des Testbefehls
In diesem Beispiel verwenden wir den Testbefehl, um sicherzustellen, dass ein Verzeichnis vorhanden ist oder nicht, bevor wir eine bestimmte Aufgabe ausführen.
#!/bin/bashDIR="/var/log"if test -d $DIR; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.3: Methode 3: Einzeilige
In diesem Beispiel werden zur Überprüfung ein- und doppelte Klammern in einzeiliger Form verwendet für das Verzeichnis. Die Anweisung nach dem Operator &&
wird ausgeführt, wenn die erste Bedingung TRUE ist, und wenn sie FALSE ist, wird die Anweisung der Anweisung ||
ausgeführt .
#!/bin/bashDIR="/var/log"] && echo "$DIR exists" || echo "$DIR doesn"t exist"
Ich würde empfehlen, ]
anstelle von
zu verwenden Für solche Einzeiler-Codes in der Shell-Programmierung.
Ähnlich können wir mit &&
und ||
den Testbefehl zur Überprüfung verwenden Wenn ein Verzeichnis vorhanden ist
#!/bin/bashDIR="/var/log"test -d $DIR && echo "$DIR exists" || echo "$DIR doesn"t exist"
4. Bash / Shell: Überprüfen Sie, ob ein Verzeichnis vorhanden ist (leer oder nicht leer).
Es gibt keine Shell-Attribute Wie ich in allen anderen Beispielen und Szenarien in diesem Tutorial verwendet habe. Wir haben jedoch einige Hacks, mit denen wir überprüfen können, ob das Verzeichnis leer oder nicht leer ist.
4.1: Methode 1: Auflisten des Verzeichnisinhalts und Überprüfen von
In diesem Beispiel werden wir den Inhalt des Verzeichnisses auflisten, die Ausgabe unterdrücken und dann anhand des Exit-Codes prüfen, ob das Verzeichnis leer ist oder welche enthält Inhalt
#!/bin/bashDIR="/tmp"if ls -1qA $DIR | grep -q . ; then echo "$DIR is not -empty"else echo "$DIR is empty"fi
Wir können dies auch umkehren, indem wir eine NOT-Bedingung (!
) setzen. Es würde also so aussehen:
#!/bin/bashDIR="/tmp"if ! ls -1qA $DIR | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
Die Ausgabe wäre in beiden Beispielskripten gleich.
4.2: Methode 2: Verwenden Suchbefehl
Wir können den Befehl find verwenden und dann die Ausgabe unterdrücken, um zu überprüfen, ob das Zielverzeichnis Inhalt enthält oder nicht.
#!/bin/bashDIR="/tmp"if find -- "$DIR" -prune -type d -empty | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
4.3: Methode 3: Auflisten des Inhalts
Wie bereits erwähnt, werden wir den Inhalt des Verzeichnisses auflisten, da es keine einfache Möglichkeit gibt, zu überprüfen, ob ein Verzeichnis leer ist oder einige Attribute nicht verwendet. Wenn Sie keine Ausgabe erhalten, ist das Verzeichnis leer oder nicht leer.
#!/bin/bashDIR="/tmp"if ] ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
5. Bash / Shell: Liste der zu testenden Attribute
Ebenso gibt es viele weitere Attribute, die Sie mit Shell-Skripten verwenden können, um nach verschiedenen Dateitypen zu suchen, z. B. nach symbolischen Links, Dateiberechtigungen usw.
Attribute
Was macht es?
-a FILE
True, wenn FILE
existiert
-b FILE
Richtig, wenn FILE
existiert und ist eine spezielle Blockdatei.
-c FILE
True, wenn FILE
existiert und ist eine spezielle Zeichendatei.
-d FILE
True if FILE
existiert und ist ein Verzeichnis.
True, wenn FILE
existiert
-f FILE
True, wenn FILE
vorhanden ist und eine reguläre Datei ist
-g FILE
True, wenn FILE
existiert und sein Set-Group-ID-Bit gesetzt ist
-h FILE
True, wenn FILE
existiert und eine symbolische Verknüpfung
-k FILE
True, wenn FILE
existiert und sein „sticky“ -Bit gesetzt ist
-p FILE
True, wenn FILE
existiert und a ist Named Pipe (FIFO)
-r FILE
True, wenn FILE
existiert und ist lesbar
-s FILE
True, wenn FILE
existiert und hat eine Größe größer als Null
-u FILE
True, wenn FILE
vorhanden ist und das gesetzte Benutzer-ID-Bit gesetzt ist
-w FILE
True, wenn FILE
vorhanden und beschreibbar ist
-x FILE
True, wenn FILE
vorhanden und ausführbar ist
-G FILE
True, wenn FILE
vorhanden ist und der effektiven Gruppen-ID
gehört -L FILE
True, wenn FILE
vorhanden ist und eine symbolische Verknüpfung
ist
-N FILE
True, wenn FILE
vorhanden ist und seit dem letzten Lesen geändert wurde
-o FILE
True, wenn FILE
vorhanden ist und dem Effektiven gehört Benutzer-ID
-S FILE
True, wenn FILE
vorhanden ist und ist ein Socket
True, wenn sich FILE1
und FILE2
auf dasselbe Gerät beziehen und Inode-Nummern
FILE1 -nt FILE2
True, wenn FILE1
ist neuer (je nach Änderungsdatum) als FILE2
oder wenn FILE1
vorhanden ist und FILE2
nicht
FILE1 -ot FILE2
Richtig, wenn FILE1
älter ist als FILE2
oder wenn FILE2
existiert und FILE1
nicht
Schlussfolgerung
In diesem Abschnitt werden Beispiele gezeigt, mit denen überprüft werden kann, ob in Bash eine reguläre Datei vorhanden ist.
1.1: Methode 1: Verwenden von einfachen oder doppelten Klammern
Verwenden von doppelten Klammern ]
#!/bin/bashFILE="/etc/passwd"if ];then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
Verwenden einzelner Klammern
#!/bin/bashFILE="/etc/passwd"if ;then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
1.2: Methode 2: Verwenden des Testbefehls
test
wird zum Überprüfen und Vergleichen von Dateitypen verwendet Werte.
#!/bin/bashFILE="/etc/passwd"if test -f $FILE; then echo "$FILE exists"else echo "$FILE missing"fi
1.3: Methode 3: Einzeilige Zeile
In diesem Beispiel können hier einfache oder doppelte Klammern verwendet werden. Ich würde empfehlen, immer doppelte Klammern zu verwenden, wenn Sie einen Liner-Code in die Shell schreiben, da dies das Risiko minimiert, dass beim Aufteilen von Wörtern Warnungen auf der Konsole angezeigt werden.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists" || echo "$FILE missing"
Die Anweisung nach &&
wird ausgeführt, wenn ERFOLGREICH ist. Wenn die erste Bedingung FALSE zurückgibt, wird die Anweisung mit ||
ausgeführt.
Überprüfen Sie in ähnlicher Weise mit dem Befehl test, ob eine reguläre Datei in Bash- oder Shell-Skript in einer Zeile vorhanden ist
#!/bin/bashFILE="/etc/passwd"test -f $FILE && echo "$FILE exists" || echo "$FILE missing"
2. Bash / Shell: Überprüfen Sie, ob eine Datei vorhanden ist (leer oder nicht leer ist).
Überprüfen Sie, ob die Datei vorhanden ist und wenn es leer ist oder Inhalt hat, verwenden wir das Attribut „-s
“
2.1: Methode 1: Verwenden von einfachen oder doppelten Klammern
Überprüfen Sie in doppelten Klammern, ob eine Datei vorhanden und leer oder nicht leer ist. ]
#!/bin/bashFILE="/etc/passwd"if ]; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
Überprüfen Sie, ob die Datei vorhanden ist existiert und ist leer oder nicht leer in doppelten Klammern
if ; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
2.2: Methode 2: Verwenden des Testbefehls
Verwenden des Testbefehls kombinieren wir das Attribut -s
, um zu überprüfen, ob Datei existiert und ist leer oder hat einen Inhalt:
2.3: Methode 3: Einzeilige
Wir können sowohl doppelte als auch einfache Klammern für einen solchen Liner verwenden, aber wie ich bereits sagte, würde ich die Verwendung von doppelten Klammern empfehlen.
#!/bin/bashFILE="/etc/passwd"test -s $FILE && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
In ähnlicher Weise können wir mit dem Testbefehl &&
und ||
verwenden Operator zum Überprüfen der Datei in einzeiligen Befehlen in unserem Shell-Skript.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
3. Bash / Shell: Überprüfen Sie, ob ein Verzeichnis vorhanden ist
Ich hoffe, Sie wissen, dass unter Linux alles eine Datei ist. Auf diese Weise wird ein Verzeichnis auch als Datei betrachtet. Wir können das Attribut „-d
“ verwenden, um zu überprüfen, ob in der Shell-Programmierung ein Verzeichnis vorhanden ist.
3.1: Methode 1: Verwenden von doppelten oder einfachen Klammern
Wir können das Attribut -d
in einfachen oder doppelten Klammern
]
verwenden, um dies zu überprüfen Wenn ein Verzeichnis vorhanden ist.
#!/bin/bashDIR="/var/log"if ]; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
In diesem Beispiel verwenden wir einzelne Klammern, um zu überprüfen, ob das Verzeichnis im Shell-Skript voreingestellt ist.
#!/bin/bashDIR="/var/log"if ; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.2: Methode 2: Verwenden des Testbefehls
In diesem Beispiel verwenden wir den Testbefehl, um sicherzustellen, dass ein Verzeichnis vorhanden ist oder nicht, bevor wir eine bestimmte Aufgabe ausführen.
#!/bin/bashDIR="/var/log"if test -d $DIR; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.3: Methode 3: Einzeilige
In diesem Beispiel werden zur Überprüfung ein- und doppelte Klammern in einzeiliger Form verwendet für das Verzeichnis. Die Anweisung nach dem Operator &&
wird ausgeführt, wenn die erste Bedingung TRUE ist, und wenn sie FALSE ist, wird die Anweisung der Anweisung ||
ausgeführt .
#!/bin/bashDIR="/var/log"] && echo "$DIR exists" || echo "$DIR doesn"t exist"
Ich würde empfehlen, ]
anstelle von zu verwenden Für solche Einzeiler-Codes in der Shell-Programmierung.
Ähnlich können wir mit &&
und ||
den Testbefehl zur Überprüfung verwenden Wenn ein Verzeichnis vorhanden ist
#!/bin/bashDIR="/var/log"test -d $DIR && echo "$DIR exists" || echo "$DIR doesn"t exist"
4. Bash / Shell: Überprüfen Sie, ob ein Verzeichnis vorhanden ist (leer oder nicht leer).
Es gibt keine Shell-Attribute Wie ich in allen anderen Beispielen und Szenarien in diesem Tutorial verwendet habe. Wir haben jedoch einige Hacks, mit denen wir überprüfen können, ob das Verzeichnis leer oder nicht leer ist.
4.1: Methode 1: Auflisten des Verzeichnisinhalts und Überprüfen von
In diesem Beispiel werden wir den Inhalt des Verzeichnisses auflisten, die Ausgabe unterdrücken und dann anhand des Exit-Codes prüfen, ob das Verzeichnis leer ist oder welche enthält Inhalt
#!/bin/bashDIR="/tmp"if ls -1qA $DIR | grep -q . ; then echo "$DIR is not -empty"else echo "$DIR is empty"fi
Wir können dies auch umkehren, indem wir eine NOT-Bedingung (!
) setzen. Es würde also so aussehen:
#!/bin/bashDIR="/tmp"if ! ls -1qA $DIR | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
Die Ausgabe wäre in beiden Beispielskripten gleich.
4.2: Methode 2: Verwenden Suchbefehl
Wir können den Befehl find verwenden und dann die Ausgabe unterdrücken, um zu überprüfen, ob das Zielverzeichnis Inhalt enthält oder nicht.
#!/bin/bashDIR="/tmp"if find -- "$DIR" -prune -type d -empty | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
4.3: Methode 3: Auflisten des Inhalts
Wie bereits erwähnt, werden wir den Inhalt des Verzeichnisses auflisten, da es keine einfache Möglichkeit gibt, zu überprüfen, ob ein Verzeichnis leer ist oder einige Attribute nicht verwendet. Wenn Sie keine Ausgabe erhalten, ist das Verzeichnis leer oder nicht leer.
#!/bin/bashDIR="/tmp"if ] ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
5. Bash / Shell: Liste der zu testenden Attribute
Ebenso gibt es viele weitere Attribute, die Sie mit Shell-Skripten verwenden können, um nach verschiedenen Dateitypen zu suchen, z. B. nach symbolischen Links, Dateiberechtigungen usw.
Attribute | Was macht es? |
---|---|
-a FILE |
True, wenn FILE existiert |
-b FILE |
Richtig, wenn FILE existiert und ist eine spezielle Blockdatei. |
-c FILE |
True, wenn FILE existiert und ist eine spezielle Zeichendatei. |
-d FILE |
True if FILE existiert und ist ein Verzeichnis. |
True, wenn FILE existiert |
|
-f FILE |
True, wenn FILE vorhanden ist und eine reguläre Datei ist |
-g FILE |
True, wenn FILE existiert und sein Set-Group-ID-Bit gesetzt ist |
-h FILE |
True, wenn FILE existiert und eine symbolische Verknüpfung |
-k FILE |
True, wenn FILE existiert und sein „sticky“ -Bit gesetzt ist |
-p FILE |
True, wenn FILE existiert und a ist Named Pipe (FIFO) |
-r FILE |
True, wenn FILE existiert und ist lesbar |
-s FILE |
True, wenn FILE existiert und hat eine Größe größer als Null |
-u FILE |
True, wenn FILE vorhanden ist und das gesetzte Benutzer-ID-Bit gesetzt ist |
-w FILE |
True, wenn FILE vorhanden und beschreibbar ist |
-x FILE |
True, wenn FILE vorhanden und ausführbar ist |
-G FILE |
True, wenn FILE vorhanden ist und der effektiven Gruppen-ID |
gehört -L FILE |
True, wenn FILE vorhanden ist und eine symbolische Verknüpfung |
-N FILE |
True, wenn FILE vorhanden ist und seit dem letzten Lesen geändert wurde |
-o FILE |
True, wenn FILE vorhanden ist und dem Effektiven gehört Benutzer-ID |
-S FILE |
True, wenn FILE vorhanden ist und ist ein Socket |
|
True, wenn sich FILE1 und FILE2 auf dasselbe Gerät beziehen und Inode-Nummern |
FILE1 -nt FILE2 |
True, wenn FILE1 ist neuer (je nach Änderungsdatum) als FILE2 oder wenn FILE1 vorhanden ist und FILE2 nicht |
FILE1 -ot FILE2 |
Richtig, wenn FILE1 älter ist als FILE2 oder wenn FILE2 existiert und FILE1 nicht |