it-swarm.com.de

Einzelner Befehl zum Überprüfen, ob eine Datei vorhanden ist, und Drucken einer (benutzerdefinierten) Nachricht an stdout?

Ich 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 Tippen dort :) Also habe ich gewandert, wenn es einen "Standard" -Einzelbefehl gibt, der das Ergebnis der Dateiexistenz an stdout zurückgibt?

Ich kann auch test mit 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 Fehler).

Der Grund, den ich frage, ist, dass ich die Existenz von Dateien in gnuplot testen muss, dessen "system("command") den resultierenden Zeichenstrom von stdout als Zeichenfolge zurückgibt. "; in gnuplot kann ich direkt machen:

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

ich würde also im Grunde gerne so etwas schreiben können (Pseudo):

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

... leider kann ich das nicht direkt über test und $? verwenden:

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.

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

(Beachten Sie, dass ls möglicherweise ein Kandidat ist, die Standardausgabe jedoch viel zu ausführlich ist. Wenn ich dies vermeiden möchte, muss ich die gesamte Ausgabe unterdrücken und den Status "Vorhanden" wie in "Zurück" zurückgeben

$ 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 Tippen) und "invertierte" Logik ...)

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

18
sdaau

Klingt so, als müssten Sie den Exit-Status umkehren, damit Sie Folgendes tun können:

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

oder:

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

(beachten Sie, dass -f steht für , wenn eine Datei vorhanden ist nd eine reguläre Datei ist).

9

Verwenden Sie diesen einzelnen Bash-Befehl:

 [ -f /home/user/file_name ]

Das [] Test durchführen und bei Erfolg 0 zurückgeben

5
YaronE

Was ist mit "Umkehren der Logik" durch:

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