Frage Wie kann ich feststellen, ob eine normale Datei in Bash nicht existiert?


Ich habe das folgende Skript verwendet, um festzustellen, 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 korrekte Syntax, wenn ich nur überprüfen möchte, ob die Datei funktioniert? nicht existieren?

#!/bin/bash

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

2507
2018-03-12 14:48


Ursprung


Antworten:


Das Prüfung Befehl ([ Hier) hat einen "nicht" logischen Operator, der das Ausrufezeichen (ähnlich wie viele andere Sprachen) ist. Versuche dies:

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

3520
2018-03-12 14:50



Bash-Datei-Test

-b filename - Sonderdatei blockieren
-c filename - Datei mit Sonderzeichen
-d directoryname - Überprüfen Sie auf Verzeichnis Existenz
-e filename - Auf Dateiexistenz prüfen, unabhängig vom Typ (Knoten, Verzeichnis, Socket usw.)
-f filename - Überprüfen Sie, ob die Datei normal existiert und kein Verzeichnis
-G filename - Überprüfen Sie, ob die Datei existiert und der effektiven Gruppen-ID gehört
-G filename set-group-id - True, wenn Datei existiert und Set-Group-ID ist
-k filename - Klebriges Gebiss
-L filename - Symbolischer Link
-O filename - True, wenn die Datei existiert und der effektiven Benutzer-ID gehört
-r filename - Überprüfen Sie, ob die Datei lesbar ist
-S filename - Überprüfen Sie, ob die Datei Socket ist
-s filename - Überprüfen Sie, ob die Datei eine Größe ungleich Null hat
-u filename - Überprüfen Sie, ob das Bit file set-user-id gesetzt ist
-w filename - Überprüfen Sie, ob die Datei beschreibbar ist
-x filename - Überprüfen Sie, ob die Datei ausführbar ist

Wie benutzt man:

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

EIN Testausdruck kann negiert werden mit dem ! Operator

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

427
2018-01-16 14:25



Sie können einen Ausdruck mit "!" Negieren:

#!/bin/bash
FILE=$1

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

Die relevante Manpage ist man test oder gleichwertig, man [ -- oder help test oder help [ für den integrierten Bash-Befehl.


250
2018-03-12 14:50



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

Es ist auch möglich, dass die Datei eine unterbrochene symbolische Verbindung oder eine nicht reguläre Datei wie z.B. ein Sockel, Gerät oder Fifo. Um beispielsweise eine Überprüfung auf fehlerhafte symbolische Links hinzuzufügen, gehen Sie wie folgt vor:

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

110
2018-03-12 14:52



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

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

zu

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

oder

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

80
2017-08-11 09:15



Ich ziehe es vor, den folgenden Einzeiler zu machen, in POSIX Shell-kompatibles Format:

$ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND"

$ [ -f "/$DIR/$FILE" ] && echo "$FILE FOUND"

Für ein paar Befehle, wie ich es in einem Skript tun würde:

$  [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;}

Sobald ich damit anfing, benutze ich selten die vollständig typisierte Syntax mehr !!


56
2017-10-18 16:09



Um die Dateiexistenz zu testen, kann der Parameter eine der folgenden sein:

-e: Returns true if file exists (regular file, directory, or symlink)
-f: Returns true if file exists and is a regular file
-d: Returns true if file exists and is a directory
-h: Returns true if file exists and is a symlink

Alle folgenden Tests gelten für normale Dateien, Verzeichnisse und symbolische Links:

-r: Returns true if file exists and is readable
-w: Returns true if file exists and is writable
-x: Returns true if file exists and is executable
-s: Returns true if file exists and has a size > 0

Beispielskript:

#!/bin/bash
FILE=$1

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

36
2017-12-19 12:47