web-dev-qa-db-fra.com

Commande unique pour vérifier si le fichier existe et imprimer un message (personnalisé) sur stdout?

J'espère que c'est OK de le noter, maintenant que je l'ai rencontré:

Je suis déjà conscient que l'on peut tester l'existence d'un fichier en utilisant la commande 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

... mais c'est un peu taper ici :) Donc, je me demandais s'il y avait une commande unique "par défaut", qui retournerait le résultat de l'existence du fichier à stdout?

Je peux également utiliser test avec le statut de sortie $?:

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

... mais il s'agit toujours de deux commandes - et la logique est également "inverse" (0 pour le succès et non nulle pour l'échec).

La raison pour laquelle je pose la question est que je dois tester l'existence d'un fichier dans gnuplot, dont "system("command") renvoie le flux de caractères résultant de stdout sous forme de chaîne. "; dans gnuplot je peux faire directement:

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

donc j'aimerais pouvoir écrire quelque chose comme ça (pseudo):

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

... malheureusement, je ne peux pas l'utiliser directement via test et $?:

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

... Il faudrait que j'inverse la logique.

Donc, je devrais essentiellement trouver une sorte de solution de script personnalisé (ou écrire un script en ligne comme une ligne) ... et je me suis dit, s'il existe déjà une commande par défaut qui peut imprimer 0 ou 1 (ou un message personnalisé) à stdout pour l'existence du fichier, alors je n'ai pas à le faire :)

(notez que ls peut être un candidat, mais sa sortie standard est beaucoup trop verbeuse; et si je veux éviter cela, je devrais supprimer toutes les sorties et retourner à nouveau le statut d'exister, comme dans

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

... mais c'est encore deux commandes (et plus de frappe), et une logique "inversée" ...)

Alors, existe-t-il une seule commande par défaut qui peut le faire sous Linux?

18
sdaau

Il semble que vous ayez besoin que l'état de sortie soit inversé, vous pouvez donc:

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

ou:

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

(Notez que -f est pour si le fichier existe et est un fichier normal).

9
Stéphane Chazelas

Utilisez cette commande bash unique:

 [ -f /home/user/file_name ]

Le [] effectuer le test et retourne 0 en cas de succès

5
YaronE

Qu'en est-il de "inverser la logique" en:

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