3836 Stimmen

Wie kann ich feststellen, ob eine reguläre Datei in der Bash nicht existiert?

Ich habe das folgende Skript verwendet, um zu sehen, ob eine Datei existiert:

#!/bin/bash

FILE=$1     
if [ -f $FILE ]; then
   echo "File $FILE exists."
else
   echo "File $FILE does not exist."
fi

Was ist die richtige Syntax, wenn ich nur prüfen will, ob die Datei no existieren?

#!/bin/bash

FILE=$1     
if [ $FILE does not exist ]; then
   echo "File $FILE does not exist."
fi

226 Stimmen

Ich habe dies gefunden Liste der Bash-Bedingungsanweisungen sehr nützlich.

11 Stimmen

Da ich ein sehr fauler Mensch bin, hätte ich normalerweise die folgende alberne Umgehungskonstruktion verwendet: if [ -f $FILE ]; then; else; echo "File $FILE does not exist."; fi; Wahrscheinlich ist es gut, dass ich stattdessen diese Frage gefunden und gelernt habe, wie man es richtig macht :)

7 Stimmen

Der Einfachheit halber sollten Sie "reguläre Datei" sagen, da die meisten UNIX/POSIX-Dokumente alle Arten von Dateisystemeinträgen einfach als "Dateien" bezeichnen, z. B. ist ein symbolischer Link eine Art von Datei, ebenso wie eine benannte Pipe, eine reguläre Datei, ein Verzeichnis, ein Block-Special, ein Character-Special, ein Socket usw.

5207voto

John Feminella Punkte 292907

Le site Test Befehl ( [ hier) hat einen logischen Operator "not", der das Ausrufezeichen ist (ähnlich wie in vielen anderen Sprachen). Versuchen Sie dies:

if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi

881voto

BlueCacti Punkte 8929

Bash File Testing

-b filename - Spezielle Datei blockieren
-c filename - Datei mit Sonderzeichen
-d directoryname - Prüfung auf Vorhandensein eines Verzeichnisses
-e filename - Prüfen, ob eine Datei vorhanden ist, unabhängig vom Typ (Knoten, Verzeichnis, Socket, usw.)
-f filename - Prüfung auf Existenz einer regulären Datei, nicht eines Verzeichnisses
-G filename - Prüfen, ob die Datei existiert und der effektiven Gruppen-ID gehört
-G filename set-group-id - Wahr, wenn die Datei existiert und set-group-id ist
-k filename - Klebriges Bit
-L filename - Symbolische Verbindung
-O filename - Wahr, wenn die Datei existiert und im Besitz der effektiven Benutzerkennung ist
-r filename - Prüfen, ob die Datei lesbar ist
-S filename - Prüfen, ob die Datei ein Socket ist
-s filename - Prüfen, ob die Datei eine Größe ungleich Null hat
-u filename - Prüfen, ob das set-user-id-Bit der Datei gesetzt ist
-w filename - Prüfen, ob die Datei beschreibbar ist
-x filename - Prüfen, ob die Datei ausführbar ist

Wie zu verwenden:

#!/bin/bash
file=./file
if [ -e "$file" ]; then
    echo "File exists"
else 
    echo "File does not exist"
fi 

A Testausdruck kann durch die Verwendung der ! Betreiber

#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
    echo "File does not exist"
else 
    echo "File exists"
fi

323voto

Sie können den Ausdruck innerhalb von test (wofür [ ist ein Alias) mit "!":

#!/bin/bash
FILE=$1

if [ ! -f "$FILE" ]
then
    echo "File $FILE does not exist"
fi

Die entsprechende Manpage lautet man test oder, gleichwertig, man [ -- oder help test o help [ für den eingebauten Bash-Befehl.

Alternativ (weniger häufig verwendet) können Sie das Ergebnis von test verwenden:

if ! [ -f "$FILE" ]
then
    echo "File $FILE does not exist"
fi

Diese Syntax wird in "man 1 bash" in den Abschnitten " Pipelines " und " Zusammengesetzte Befehle ".

153voto

guns Punkte 10170
[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"

Es ist auch möglich, dass die Datei ein defekter symbolischer Link oder eine nicht-reguläre Datei ist, wie z.B. ein Socket, Gerät oder Fifo. Zum Beispiel, um eine Prüfung auf defekte Symlinks hinzuzufügen:

if [[ ! -f $FILE ]]; then
    if [[ -L $FILE ]]; then
        printf '%s is a broken symlink!\n' "$FILE"
    else
        printf '%s does not exist!\n' "$FILE"
    fi
fi

115voto

Elazar Leibovich Punkte 31400

Es ist erwähnenswert, dass Sie, wenn Sie einen einzelnen Befehl ausführen müssen, diesen abkürzen können

if [ ! -f "$file" ]; then
    echo "$file"
fi

à

test -f "$file" || echo "$file"

oder

[ -f "$file" ] || echo "$file"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X