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

18

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 de taper là :)Donc, je me demandais s'il y avait une seule commande "par défaut", qui retournerait le résultat de l'existence du fichier à stdout?

Je peux également utiliser testavec 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 demande, c'est que je dois tester l'existence du fichier dans gnuplot, dont " system("command")renvoie le flux de caractères résultant de stdout sous forme de chaîne. "; en gnuplotje 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 testet $?:

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 cela lspeut ê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?

sdaau
la source
2
que diriez-vous ( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist"?
iruvar

Réponses:

9

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 -fc'est pour si le fichier existe et est un fichier normal ).

Stéphane Chazelas
la source
5

Utilisez cette commande bash unique:

 [ -f /home/user/file_name ]

L' []exécution du test et retourne 0 en cas de succès

YaronE
la source
3
ne retourne rien dans les deux cas - CentOS
amphibient
1
Fonctionne très bien sur macOS.
Joshua Pinter
1
Vous pouvez l' utiliser pour exécuter des commandes sous condition avec les &&et ||opérateurs: [ -f /home/user/file_name ] || echo "File not present"ainsi[ -f /home/user/file_name ] && echo "File is present"
charlesreid1
1
@ celui de charlesreid1 fait le travail, merci!
Marta Karas
1

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

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

Cela marche:

pwsh -c Test-Path /etc/passwd

... si vous avez installé PowerShell. Elle renvoie soit la chaîne "True", si le chemin existe, soit "False" si ce n'est pas le cas. (Est-ce que j'obtiens des points "sarcastiquement inutiles" pour cette réponse?)

Todd Walton
la source