Comando único para verificar se o arquivo existe e imprimir a mensagem (personalizada) no stdout?

18

Espero que seja bom notar isso, agora que eu o encontrei:

Eu já sei que é possível testar a existência de arquivos usando o 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

... mas isso é um pouco digitado lá :)Então, eu estava vagando se houver um comando único "padrão", que retornará o resultado da existência de arquivo stdout?

Também posso usar testcom o status de saída $?:

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

... mas ainda existem dois comandos - e a lógica também é "inversa" (0 ​​para sucesso e diferente de zero para falha).

A razão pela qual estou perguntando é que preciso testar a existência do arquivo in gnuplot, cujo " system("command")retorna o fluxo de caracteres resultante de stdout como uma string. "; em gnuploteu posso fazer diretamente:

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

então eu basicamente gostaria de escrever algo assim (pseudo):

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

... infelizmente, não posso usá-lo diretamente via teste $?:

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

... eu teria que inverter a lógica.

Então, eu basicamente teria que criar uma solução de script personalizada (ou escrever um script embutido como uma linha) ... e pensei: se já existe um comando padrão que pode imprimir 0 ou 1 (ou uma mensagem personalizada) para stdout para a existência do arquivo, então não preciso fazer isso :)

(observe que lspode ser um candidato, mas a saída stdout é muito detalhada; e se eu quiser evitar isso, teria que suprimir toda a saída e retornar novamente o status existente, como em

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

... mas são novamente dois comandos (e mais digitação) e lógica "invertida" ...)

Então, existe um único comando padrão que pode fazer isso no Linux?

sdaau
fonte
2
que tal ( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist"?
Iruvar

Respostas:

9

Parece que você precisa do status de saída revertido, para que você possa:

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

ou:

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

(observe que -fé para se o arquivo existe e é um arquivo normal ).

Stéphane Chazelas
fonte
5

Use este comando bash único:

 [ -f /home/user/file_name ]

A []realização do teste e retorna 0 em caso de sucesso

YaronE
fonte
3
não retorna nada se ambos os casos - CentOS
amphibient
11
Funciona muito bem no macOS.
Joshua Pinter
11
Você pode usar isso para executar comandos condicionalmente com o &&e ||operadores: [ -f /home/user/file_name ] || echo "File not present"e também[ -f /home/user/file_name ] && echo "File is present"
charlesreid1
11
A pessoa de @ charlesreid1 faz o trabalho, obrigado!
Marta Karas
1

Que tal "inverter a lógica" por:

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

Isso funciona:

pwsh -c Test-Path /etc/passwd

... se você possui o PowerShell instalado. Retorna a string "True", se o caminho existe, ou "False", se não existir. (Recebo pontos "sarcasticamente inúteis" para esta resposta?)

Todd Walton
fonte