¿Comando único para verificar si el archivo existe e imprimir el mensaje (personalizado) en stdout?

18

Espero que esté bien notar esto, ahora que lo he encontrado:

Ya soy consciente de que uno puede probar la existencia del archivo usando el 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

... pero eso es un poco de tipeo allí. :)Entonces, estaba divagando si hay un comando único "predeterminado", que devolverá el resultado de la existencia del archivo stdout.

También puedo usar testcon el estado de salida $?:

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

... pero esto sigue siendo dos comandos, y la lógica también es "inversa" (0 ​​para el éxito y no cero para el fracaso).

La razón por la que pregunto es que necesito probar la existencia del archivo gnuplot, cuyo " system("command")devuelve la secuencia de caracteres resultante de stdout como una cadena "; en gnuplotpuedo hacer directamente:

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

así que básicamente me gustaría poder escribir algo como esto (pseudo):

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

... desafortunadamente, no puedo usar eso directamente vía testy $?:

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

... Tendría que invertir la lógica.

Entonces, básicamente tendría que encontrar una especie de solución de script personalizada (o escribir un script en línea como una línea) ... y pensé, si ya hay un comando predeterminado que puede imprimir 0 o 1 (o un mensaje personalizado) para stdout para la existencia del archivo, entonces no tengo que hacerlo :)

(tenga en cuenta que lspuede ser un candidato, pero su salida estándar es demasiado detallada; y si quiero evitar eso, tendría que suprimir toda la salida y volver a devolver el estado de existencia, como en

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

... pero eso es nuevamente dos comandos (y más tipeo), y lógica "invertida" ...)

Entonces, ¿hay un solo comando predeterminado que pueda hacer esto en Linux?

sdaau
fuente
2
¿qué tal ( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist"?
iruvar 01 de

Respuestas:

9

Parece que necesita revertir el estado de salida, por lo que podría hacer:

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

o:

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

(tenga en cuenta que -fes para si el archivo existe y es un archivo normal ).

Stéphane Chazelas
fuente
5

Use este comando bash único:

 [ -f /home/user/file_name ]

El []realizar la prueba y devuelve 0 en caso de éxito

YaronE
fuente
3
no devuelve nada si cualquiera de los casos - CentOS
anfibio
1
Funciona muy bien en macOS.
Joshua Pinter
1
Usted puede usar esto para ejecutar comandos de forma condicional con el &&y ||los operadores: [ -f /home/user/file_name ] || echo "File not present"y también[ -f /home/user/file_name ] && echo "File is present"
charlesreid1
1
El de @ charlesreid1 hace el trabajo, ¡gracias!
Marta Karas
1

¿Qué pasa con "invertir la lógica" al:

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

Esto funciona:

pwsh -c Test-Path /etc/passwd

... si tiene instalado PowerShell. Devuelve la cadena "Verdadero", si la ruta existe, o "Falso" si no existe. (¿Recibo puntos "sarcásticamente inútiles" por esta respuesta?)

Todd Walton
fuente