Único comando para verificar se o arquivo existe e imprimir a mensagem (personalizada) para stdout?

15

Espero que seja bom anotar isso, agora que 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 de digitação lá :) Então, eu estava vagando se houvesse um único comando "padrão", que retornaria o resultado da existência do arquivo para stdout ?

Eu também posso usar test com o status de saída $? :

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

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

O motivo pelo qual estou perguntando é que preciso testar a existência de arquivos em gnuplot , cujo " system("command") retorna o caractere resultante  fluxo de stdout como uma string. "; em gnuplot 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 poder 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 consigo usar isso diretamente por meio de test e $? :

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 em linha 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 existência de arquivo, então eu não tenho que fazer isso :)

(note que ls pode ser um candidato, mas sua saída stdout é muito detalhada; e se eu quiser evitar isso, eu teria que suprimir todas as saídas e retornar novamente o status, 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 isso é 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?

    
por sdaau 01.02.2013 / 19:00

4 respostas

9

Parece que você precisa do status de saída invertido, então você pode fazer:

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

ou:

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

(observe que -f é para se o arquivo existir e é um arquivo regular ).

    
por 01.02.2013 / 19:26
2

Use este comando bash único:

 [ -f /home/user/file_name ]

O [] executa o teste e retorna 0 no sucesso

    
por 31.07.2018 / 13:31
1

Que tal "inverter a lógica" por:

file_exists = 1-system("test -f exists.file; echo $?")
    
por 07.03.2013 / 12:06
-1

Isso funciona:

pwsh -c Test-Path /etc/passwd

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

    
por 07.02.2018 / 00:38

Tags