Ein einziger Befehl, um zu prüfen, ob eine Datei vorhanden ist, und eine (benutzerdefinierte) Nachricht an stdout zu drucken?

18

Hoffe, es ist in Ordnung, dies zu bemerken, jetzt, wo ich darauf gestoßen bin:

Mir ist bereits bekannt, dass man die Existenz von Dateien mit dem Befehl test( [) testen kann :

$ touch exists.file
$ if [ -f exists.file ] ; then echo "yes" ; else echo "no" ; fi
yes
$ if [ -f noexists.file ] ; then echo "yes" ; else echo "no" ; fi
no

... aber das ist ein bisschen von dort tippen :)Also habe ich gewandert, wenn es einen "Standard" -Befehl gibt, der das Ergebnis der Dateiexistenz zurückgibt stdout?

Ich kann auch testmit dem Exit-Status verwenden $?:

$ test -f exists.file ; echo $?
0
$ test -f noexists.file ; echo $?
1

... aber das sind immer noch zwei Befehle - und die Logik ist auch "invers" (0 für Erfolg und ungleich Null für Misserfolg).

Der Grund, den ich frage, ist, dass ich auf das Vorhandensein von Dateien in testen muss, in gnuplotdenen " system("command")der resultierende Zeichenstrom von stdout als Zeichenfolge zurückgegeben wird ". in gnuplotich kann direkt tun:

gnuplot> if (0) { print "yes" } else { print "no" }
no
gnuplot> if (1) { print "yes" } else { print "no" }
yes

Ich würde also gerne in der Lage sein, so etwas zu schreiben (Pseudo):

gnuplot> file_exists = system("check_file --stdout exists.file")
gnuplot> if (file_exists)  { print "yes" } else { print "no" }
yes

... das kann ich leider nicht direkt über testund nutzen $?:

gnuplot> file_exists = system("test -f exists.file; echo $?")
gnuplot> if (file_exists)  { print "yes" } else { print "no" }
no

... Ich müsste die Logik umkehren.

Im Grunde müsste ich mir also eine Art benutzerdefinierte Skriptlösung einfallen lassen (oder ein Inline-Skript als Einzeiler schreiben) ... und ich dachte mir, ob es bereits einen Standardbefehl gibt, der 0 oder 1 drucken kann (oder eine benutzerdefinierte Nachricht) an stdout für die Existenz der Datei, dann muss ich das nicht tun :)

(Beachten Sie, dass lsdies ein Kandidat sein mag, aber die Standardausgabe viel zu ausführlich ist. Wenn ich das vermeiden möchte, müsste ich die gesamte Ausgabe unterdrücken und den existierenden Status wie in wiederherstellen

$ ls exists.file 1>/dev/null 2>/dev/null ; echo $? 
0
$ ls noexists.file 1>/dev/null 2>/dev/null ; echo $? 
2

... aber das sind wieder zwei Befehle (und mehr Tippfehler) und "invertierte" Logik ...)

Gibt es einen einzigen Standardbefehl, der dies unter Linux ausführen kann?

sdaau
quelle
2
wie wäre es ( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist"?
Iruvar

Antworten:

9

Klingt so, als müsste der Exit-Status umgekehrt werden, damit Sie Folgendes tun können:

system("[ ! -e file ]; echo $?")

oder:

system("[ -e file ]; echo $((!$?))")

(Beachten Sie, dass dies -fgilt, wenn die Datei vorhanden ist und eine reguläre Datei ist. )

Stéphane Chazelas
quelle
5

Verwenden Sie diesen einzelnen Bash-Befehl:

 [ -f /home/user/file_name ]

Das []führt den Test durch und gibt bei Erfolg 0 zurück

YaronE
quelle
3
gibt in beiden Fällen nichts zurück - CentOS
amphibient
1
Funktioniert hervorragend unter macOS.
Joshua Pinter
1
Sie können diese verwenden , um Befehle bedingt mit der laufen &&und ||Operatoren: [ -f /home/user/file_name ] || echo "File not present"und auch[ -f /home/user/file_name ] && echo "File is present"
charlesreid1
1
@ charlesreid1 macht den Job, danke!
Marta Karas
1

Was ist mit "Invertieren der Logik" durch:

file_exists = 1-system("test -f exists.file; echo $?")
user33734
quelle
-1

Das funktioniert:

pwsh -c Test-Path /etc/passwd

... wenn Sie PowerShell installiert haben. Es wird entweder die Zeichenfolge "True" zurückgegeben, wenn der Pfad vorhanden ist, oder "False", wenn dies nicht der Fall ist. (Erhalte ich für diese Antwort "sarkastisch wenig hilfreiche" Punkte?)

Todd Walton
quelle