Singolo comando per verificare l'esistenza del file e stampare il messaggio (personalizzato) su stdout?


18

Spero che vada bene notare questo, ora che l'ho incontrato:

Sono già consapevole che si può verificare l'esistenza di file usando il comando test( [):

$ 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

... ma è un po 'di digitazione lì :)Quindi, stavo vagando se c'è un singolo comando "predefinito", che restituirà il risultato dell'esistenza del file stdout?

Posso anche usare testcon lo stato di uscita $?:

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

... ma questo è ancora due comandi - e la logica è anche "inversa" (0 ​​per il successo e diverso da zero per il fallimento).

Il motivo per cui sto chiedendo è che ho bisogno di provare l'esistenza del file gnuplot, il cui " system("command")restituisce il flusso di caratteri risultante da stdout come una stringa. "; in gnuplotposso fare direttamente:

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

quindi sostanzialmente vorrei poter scrivere qualcosa del genere (pseudo):

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

... sfortunatamente, non posso usarlo direttamente tramite teste $?:

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

... Dovrei invertire la logica.

Quindi, dovrei fondamentalmente trovare una sorta di soluzione di script personalizzata (o scrivere uno script in linea come one-liner) ... e ho pensato, se esiste già un comando predefinito che può stampare 0 o 1 (o un messaggio personalizzato) a stdout per l'esistenza del file, quindi non devo farlo :)

(nota che lspotrebbe essere un candidato, ma il suo output stdout è decisamente troppo dettagliato; e se voglio evitarlo, dovrei sopprimere tutto l'output e restituire di nuovo lo stato esistente, come in

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

... ma questo è ancora due comandi (e più digitando) e logica "invertita" ...)

Quindi, esiste un singolo comando predefinito che può farlo in Linux?


2
che ne dici ( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist"?
iruvar,

Risposte:


9

Sembra che tu abbia bisogno di invertire lo stato di uscita, quindi puoi fare:

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

o:

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

(nota che -fesiste se il file esiste ed è un file normale ).


5

Usa questo comando bash singolo:

 [ -f /home/user/file_name ]

La []eseguire il test e ritorna 0 in caso di successo


3
non restituisce nulla in entrambi i casi - CentOS
anfibio,

1
Funziona alla grande su macOS.
Joshua Pinter,

1
È possibile utilizzare questo per eseguire comandi in modo condizionale con l' &&e ||operatori: [ -f /home/user/file_name ] || echo "File not present"e anche[ -f /home/user/file_name ] && echo "File is present"
charlesreid1

1
@ charlesreid1 è quello che fa il lavoro, grazie!
Marta Karas,

1

Che dire di "invertire la logica" di:

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

-1

Questo funziona:

pwsh -c Test-Path /etc/passwd

... se hai installato PowerShell. Restituisce la stringa "True", se esiste il percorso, o "False" se non lo è. (Ricevo punti "sarcasticamente inutili" per questa risposta?)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.