Befehl zum Anzeigen einer beliebigen Nachricht, wenn eine bestimmte Datei existiert

11

Gibt es einen Befehl, um die Nachricht "Ja" anzuzeigen, wenn eine bestimmte Datei existiert? Keine Notwendigkeit, Funktionalität zu geben, wenn die Datei nicht existiert.

    
james 14.06.2016, 18:58
quelle

5 Antworten

25

Verwenden Sie diesen einfachen Bash-One-Liner:

if [ -e FILENAME ] ; then echo Yes ; fi

Der -e check wird als wahr ausgewertet, wenn FILENAME existiert, egal was es ist (Datei, Verzeichnis, Link, Gerät, ...).

Wenn Sie nur reguläre Dateien überprüfen möchten, verwenden Sie stattdessen -f , wie @Arronical sagt.

    
Byte Commander 14.06.2016, 19:05
quelle
10

Sie können dieses einfache Skript verwenden:

#!/bin/bash

if [[ -f  ]]; then
    echo "Yes"
    exit 0
else
    exit 1
fi

Speichere es als file-exists.sh . Geben Sie dann im Terminal chmod +x file-exists.sh ein.

Verwenden Sie es wie folgt: ./file-exists.sh FILE Ersetzen Sie dabei FILE durch die Datei, die Sie überprüfen möchten, zum Beispiel:

./file-exists.sh file.txt

Wenn file.txt existiert, wird Yes auf das Terminal gedruckt, und das Programm wird mit dem Status 0 (Erfolg) beendet. Wenn die Datei nicht existiert, wird nichts gedruckt und das Programm wird mit dem Status 1 (Fehler) beendet.

Wenn Sie neugierig sind, warum ich den Befehl exit eingefügt habe, lesen Sie weiter ...

Was ist mit dem Befehl exit ?

?

exit bewirkt eine normale Beendigung des Prozesses. Was das bedeutet, ist im Grunde: Es stoppt das Skript. Es akzeptiert einen optionalen (numerischen) Parameter, der der Exit-Status des Skripts ist, das ihn aufgerufen hat.

Dieser Exit-Status ermöglicht es Ihren anderen Skripten, Ihr file-exists -Skript zu verwenden und zu wissen, ob die Datei existiert oder nicht.

Ein einfaches Beispiel, das dies verwendet, ist dieses Skript (speichern Sie es als file-exists-cli.sh ):

#!/bin/bash

echo "Enter a filename and I will tell you if it exists or not: "
read FILE
# Run 'file-exists.sh' but discard any output because we don't need it in this example
./file-exists.sh $FILE &>> /dev/null
# #? is a special variable that holds the exit status of the previous command
if [[ $? == 0 ]]; then
    echo "$FILE exists"
else
    echo "$FILE does not exist"
fi

Führe das übliche chmod +x file-exists-cli.sh aus und führe es dann aus: ./file-exists-cli.sh . Sie werden so etwas sehen:

Datei existiert ( exit 0 ):

➜  ~ ./file-exists-cli.sh 
Enter a filename and I will tell you if it exists or not: 
booleans.py
booleans.py exists

Datei existiert nicht ( exit 1 ):

➜  ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not: 
asdf
asdf does not exist
    
grooveplex 14.06.2016 19:09
quelle
9

In der Bash-Shell in der Befehlszeile.

if [[ -f /path/to/file ]]; then echo "Yes"; fi

Dies verwendet den Bash-Bedingungsoperator -f und prüft, ob die Datei existiert und eine reguläre Datei ist. Wenn Sie nach Dateien einschließlich Verzeichnissen und Links suchen möchten, verwenden Sie -e .

Dies ist eine großartige Ressource für Bash-Bedingungen.

    
Arronical 14.06.2016 19:03
quelle
5

Der kürzeste Befehl für das, was Sie wollen, ist:

test -e FILENAME && echo Yes

test -e testet, ob der angegebene Name im Dateisystem existiert. (Sie können test -f nur für reguläre Dateien verwenden. Weitere Informationen finden Sie unter man test .)

Wenn die angegebene Bedingung als wahr ausgewertet wird, gibt test einen erfolgreichen Exit-Status zurück (andernfalls wird ein Fehlerstatus zurückgegeben). Wir kombinieren die beiden Befehle mit && , was bedeutet "Führe den nächsten Befehl aus, wenn der vorherige Befehl mit einem Erfolgsstatus beendet wurde". Der nächste Befehl druckt einfach Yes auf die Standardausgabe; im Falle einer interaktiven Shell auf dem Terminal.

Dies vermeidet das zusätzliche Textmaterial einer if -Anweisung, führt jedoch zum gleichen Ergebnis. Die Verwendung von && (oder umgekehrt, || ) zum Verknüpfen von Befehlen funktioniert gut, wenn nur ein einzelner Befehl beteiligt ist. Wenn Sie mehr als nur einen einzelnen Befehl als Reaktion auf den Exit-Status eines einzelnen Befehls ausführen möchten, wird die Syntax if schnell lesbarer.

Wie bereits in anderen Antworten erwähnt, wäre das äquivalente Konstrukt if style:

if test -e FILENAME; then echo Yes; fi

oder alternativ:

if test -e FILENAME
then
    echo Yes
fi

Für diese Zwecke sind [ und test äquivalent, außer dass [ ein abschließendes ] erfordert.

    
Michael Kjörling 15.06.2016 15:35
quelle
4

Um diese Art von Frage auszublenden, gibt es mehrere Möglichkeiten, und hier ist eine andere: Verwenden Sie den Befehl find mit -exec flag. Der Pfad zur Datei kann in zwei Teile aufgeteilt werden: find /etc , der das Verzeichnis einstellt und -name FILENAME , das den Dateinamen angibt (duh!). -maxdepth behält find nur bei /etc -Verzeichnis und geht nicht in Unterverzeichnisse

adminx@L455D:~$ find /etc -maxdepth 1  -name passwd -exec printf "YES\n" \;
YES
adminx@L455D:~$ find /etc -maxdepth 1  -name passwd1 -exec printf "YES\n" \;
adminx@L455D:~$ 

Eine andere Möglichkeit, über stat :

adminx@L455D:~$ stat /etc/passwd1 &>/dev/null && echo YES
adminx@L455D:~$ stat /etc/passwd &>/dev/null && echo YES
YES

Und alternativ über python:

>>> import os
>>> if os.stat('/etc/passwd'): 
...    print 'YES'
... 
YES
>>> if os.stat('/etc/passwd1'): 
...    print 'YES'
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/etc/passwd1'

Oder eine kurze Befehlszeilenalternative:

 python -c "from os.path import exists; print 'Yes' if exists('/etc/fstab') else '' "
    
Sergiy Kolodyazhnyy 14.06.2016 21:48
quelle

Tags und Links