Gibt es einen Befehl zum Anzeigen der Meldung "Ja", wenn eine bestimmte Datei vorhanden ist? Wenn die Datei nicht vorhanden ist, müssen keine Funktionen angegeben werden.
command-line
James
quelle
quelle
[ -e FILENAME ] && echo Yes
FILENAME
es sich um eine variable Erweiterung handelt oder Sonderzeichen enthält, vergessen Sie nicht, diese in Anführungszeichen zu setzen. zB in einem Skript ,[ -e "$1" ] && echo Yes
.[[
und]]
nicht zitieren.[[ ]]
Zitieren ist immer eine gute Angewohnheit für Anfänger, die sich nicht an die speziellen Regeln für das Innere des[[ ]]
Operators oder für arithmetische Kontexte erinnern .Sie können dieses einfache Skript verwenden:
Speichern Sie es als
file-exists.sh
. Geben Sie dann im Terminal Folgendes einchmod +x file-exists.sh
.Verwenden Sie es wie folgt:
./file-exists.sh FILE
Wo Sie es durchFILE
die Datei ersetzen, die Sie überprüfen möchten, zum Beispiel:Wenn
file.txt
vorhanden,Yes
wird auf dem Terminal gedruckt und das Programm wird mit dem Status 0 (Erfolg) beendet. Wenn die Datei nicht vorhanden ist, wird nichts gedruckt und das Programm wird mit Status 1 beendet (Fehler).Wenn Sie neugierig sind, warum ich den
exit
Befehl eingefügt habe , lesen Sie weiter ...Was ist mit dem
exit
Befehl los?exit
bewirkt eine normale Prozessbeendigung. Dies bedeutet im Grunde: Es stoppt das Skript. Es akzeptiert einen optionalen (numerischen) Parameter, der den Exit-Status des Skripts darstellt, das ihn aufgerufen hat.Dieser Beendigungsstatus ermöglicht es Ihren anderen Skripten, Ihr
file-exists
Skript zu verwenden, und gibt Aufschluss darüber, ob die Datei vorhanden ist oder nicht.Ein einfaches Beispiel, das dies verwendet, ist dieses Skript (speichern unter
file-exists-cli.sh
):Machen Sie das Übliche
chmod +x file-exists-cli.sh
und führen Sie es dann aus :./file-exists-cli.sh
. Sie werden so etwas sehen:Datei existiert (
exit 0
):Datei existiert nicht (
exit 1
):quelle
"$1"
. Wenn es Leerzeichen enthält, wird es ohne Anführungszeichen unterbrochen und andere schlechte Dinge können passieren.In der Bash-Shell in der Kommandozeile.
Dies verwendet den bedingten Bash-Operator
-f
und prüft, ob die Datei vorhanden ist 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.
quelle
test
Originalformats, ich weiß, dass es übertrieben ist, aber es ist meine Gewohnheit.[
Befehl aufzurufen , der normalerweise einen integrierten Befehl aufruft). Sie korrigieren Inkonsistenzen und dummes Verhalten der Single-Brace-Version. Das [eingebaute [bleibt aus Kompatibilitätsgründen erhalten, aber ich sehe keinen guten Grund, es in neuem Bash-Code zu verwenden. (Wenn Sie POSIX-kompatible Skripte schreiben müssen, die auf alten Shells oder Ähnlichem ausgeführt werden können, ist das anders.)[
es zweifelhaft ist , " normalerweise einen eingebauten" zu nennen.type -a [
für mich listet "Shell Builtin", dann "/usr/bin/[
."type
Ergebnisse scheinen zu bestätigen, was ich gesagt habe, nein?Der kürzeste Befehl, um das zu tun, was Sie wollen, ist:
test -e
testet, ob der angegebene Name im Dateisystem vorhanden ist. (Sie können verwenden,test -f
um nur auf reguläre Dateien zu beschränken. Weitereman test
Informationen finden Sie hier.)Wenn die angegebene Bedingung als wahr ausgewertet wird, wird
test
ein erfolgreicher Beendigungsstatus zurückgegeben (andernfalls wird ein Fehlerstatus zurückgegeben). Wir kombinieren die beiden Befehle mit&&
, was bedeutet, dass "der nächste Befehl ausgeführt wird, wenn der vorherige Befehl mit einem Erfolgsstatus beendet wurde". Der nächste Befehl druckt einfachYes
auf der Standardausgabe. im Falle einer interaktiven Shell auf dem Terminal.Dies vermeidet das zusätzliche Textmaterial einer
if
Aussage, führt jedoch zum gleichen Ergebnis. Die Verwendung&&
(oder des Gegenteils||
) zum Zusammenbinden von Befehlen funktioniert gut, wenn nur ein einziger Befehl beteiligt ist. Wenn Sie mehr als nur einen einzelnen Befehl als Antwort auf den Exit-Status eines einzelnen Befehls ausführen möchten, ist die Verwendung derif
Syntax schnell besser lesbar.Wie bereits in anderen Antworten ausgeführt, wäre das äquivalente
if
Stilkonstrukt:oder alternativ:
Für diese Zwecke
[
undtest
sind gleichwertig, außer dass[
eine Kündigung erforderlich ist]
.quelle
Um diese Art von Frage zu beantworten, gibt es mehrere Möglichkeiten, und hier ist eine andere: Verwenden Sie den
find
Befehl mit-exec
Flag. Der Pfad zur Datei kann in zwei Teile aufgeteilt werden,find /etc
die das Verzeichnis-name FILENAME
festlegen und den Dateinamen angeben (duh!).-maxdepth
haltenfind
mit Arbeit/etc
nur Verzeichnis und senkt sich nicht in UnterverzeichnisseEin anderer Weg über
stat
:Und alternativ über Python:
Oder eine kurze Befehlszeilenalternative:
quelle