Existe-t-il une commande pour afficher le message «Oui» si un fichier particulier existe? Pas besoin de donner de fonctionnalité si le fichier n'existe pas.
command-line
James
la source
la source
[ -e FILENAME ] && echo Yes
FILENAME
s'agit d'une extension variable ou qui contient des caractères spéciaux, n'oubliez pas de la citer. par exemple dans un script,[ -e "$1" ] && echo Yes
.[[
et]]
au lieu de citer la variable.[[ ]]
, toujours citer est une bonne habitude pour les débutants qui ne se souviennent pas des règles spéciales pour l'intérieur de l'[[ ]]
opérateur ou pour les contextes arithmétiques.Vous pouvez utiliser ce script simple:
Enregistrez-le sous
file-exists.sh
. Ensuite, dans le terminal, tapezchmod +x file-exists.sh
.Utilisez-le comme:
./file-exists.sh FILE
où vous remplacezFILE
par le fichier que vous souhaitez vérifier, par exemple:S'il
file.txt
existe,Yes
sera imprimé sur le terminal et le programme quittera avec le statut 0 (succès). Si le fichier n'existe pas, rien ne sera imprimé et le programme quittera avec le statut 1 (échec).Si vous êtes curieux de savoir pourquoi j'ai inclus la
exit
commande, lisez la suite ...Qu'est-ce qui se passe avec la
exit
commande?exit
provoque l'arrêt normal du processus. Ce que cela signifie, en gros: il arrête le script. Il accepte un paramètre facultatif (numérique) qui sera l'état de sortie du script qui l'a appelé.Cet état de sortie permet à vos autres scripts d'utiliser votre
file-exists
script et est leur façon de savoir si le fichier existe ou non.Un exemple simple qui met cela à profit est ce script (enregistrez-le sous
file-exists-cli.sh
):Faites l'habitude
chmod +x file-exists-cli.sh
et puis exécutez:./file-exists-cli.sh
. Vous verrez quelque chose comme ceci:Le fichier existe (
exit 0
):Le fichier n'existe pas (
exit 1
):la source
"$1"
. S'il contient un espace blanc, il se cassera sans guillemets et d'autres mauvaises choses peuvent se produire.Dans le shell bash sur la ligne de commande.
Cela utilise l'opérateur conditionnel bash
-f
et vérifie si le fichier existe et s'il s'agit d'un fichier normal. Si vous souhaitez tester des fichiers, y compris des répertoires et des liens, utilisez-e
.Ceci est une excellente ressource pour les conditionnels bash.
la source
test
son format d'origine, je sais que c'est exagéré, mais c'est une de mes habitudes.[
commande, qui appelle généralement une fonction intégrée). Ils corrigent les incohérences et les comportements stupides de la version à accolade simple. Le [builtin reste pour la compatibilité, mais je ne vois aucune bonne raison de l'utiliser dans le nouveau code bash. (Si vous avez besoin d'écrire des scripts compatibles POSIX pouvant s'exécuter sur d'anciens shells ou quelque chose du genre, c'est différent.)[
appelle généralement un intégré" est douteux.type -a [
pour moi liste "shell intégré", puis "/usr/bin/[
."type
résultats semblent corroborer ce que j'ai dit, non?La commande la plus courte pour faire ce que vous voulez est:
test -e
testera si le nom donné existe dans le système de fichiers. (Vous pouvez utilisertest -f
pour restreindre aux fichiers normaux uniquement. Voirman test
pour en savoir plus.)Si la condition donnée prend la valeur true,
test
renvoie un état de sortie réussi (sinon, il renvoie un état d'échec). Nous combinons les deux commandes à l'aide de&&
, ce qui signifie "exécuter la commande suivante si la commande précédente s'est terminée avec un état de réussite". La commande suivante imprime simplementYes
sur la sortie standard; dans le cas d'un shell interactif, sur le terminal.Cela évite le matériel textuel supplémentaire d'une
if
déclaration, mais donne le même résultat. Utiliser&&
(ou son contraire||
) pour lier des commandes ensemble fonctionne bien lorsqu'une seule commande est impliquée. Si vous souhaitez faire plus qu'exécuter une seule commande en réponse à l'état de sortie d'une seule commande, l'utilisation de laif
syntaxe devient rapidement beaucoup plus lisible.Comme déjà souligné dans d'autres réponses, la
if
construction de style équivalente serait:Ou bien:
À ces fins,
[
ettest
sont équivalents, sauf que cela[
nécessite une résiliation]
.la source
Pour habiller ce type de question, il existe plusieurs façons, et en voici une autre: utilisez la
find
commande avec-exec
indicateur. Le chemin d'accès au fichier peut être divisé en deux partiesfind /etc
qui définit le répertoire et-name FILENAME
qui spécifie le nom du fichier (duh!).-maxdepth
continuera àfind
travailler/etc
uniquement avec le répertoire et ne descendra pas dans les sous-répertoiresUne autre manière, via
stat
:Et alternativement via python:
Ou une alternative courte en ligne de commande:
la source