IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Tester l'existence d'un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Equateur

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 3
    Par défaut Tester l'existence d'un fichier
    Salut , en Shell pour tester l’existence d'une chaîne suivant un nom donné (ch1 par ex ) , est ce qui il faut parcourir un répertoire et tester au meme temps (si oui comment on fait ce parcours ) ou on teste directement et ici quelle est l’écriture vraie :

    ou
    2)'test' c'est obligatoire pour faire un test ou comparaison ,ou on peut écrire directement ( -s $fichier par ex sans test -s $fichier )

    et Merci d'avance

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 298
    Par défaut
    Bonjour,

    Quelques mises au point:
    1. [ ] est un raccourci pour la commande test. Il faut des espaces autour des crochets.
    2. -e teste l'existence du fichier alors que -f vérifie que c'est un fichier et non un répertoire.
    3. Quand au parcours du répertoire, je ne comprends ce que cela veux dire. Il teste l'expression que tu lui donne. Point.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Equateur

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 3
    Par défaut
    Bonjour et merci pour votre réponse , a propos du parcours , par exemple comment tester si une chaîne ch1 correspond son nom a un fichier dans un répertoire contient des différents fichier de différents nom ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Peux-tu mettres les mots dans le bon ordre. C'est incompréhensible.
    Peux-tu aussi donner un exemple ?

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 870
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par coros04 Voir le message
    2)'test' c'est obligatoire pour faire un test ou comparaison ,ou on peut écrire directement ( -s $fichier par ex sans test -s $fichier )
    Salut
    L'option "-s" est une option de la commande "test". C'est la commande "test" qui permet de faire des évaluations diverses en shell et "-s" indique quelle évaluation exactement tu veux faire (ici tester si le fichier existe et est non vide)
    -s tout court ne veut rien dire (il y a tant de commandes qui ont cette option, comment veux-tu que le shell sache de laquelle il s'agit ?????!!!!!!????)

    Pour tes autres question, moi non plus je ne pige pas ce que tu veux dire...

    Citation Envoyé par Flodelarab Voir le message
    ...alors que -f vérifie que c'est un fichier et non un répertoire.
    Raté. Déjà un répertoire c'est d'abord et aussi un fichier.
    Donc l'option "-f" vérifie que c'est un fichier de type "régulier", (par opposition aux fichiers de type répertoire, de type lien, de type socket, de type pipe, de type bloc ou de type caractère)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 396
    Par défaut
    Bonjour,
    C'est vrai que la dernière question n'est pas vraiment compréhensible (mais le français n'est pas vraiment la langue officielle de l'équateur ).
    Voici un exemple de test sur fichier "régulier" qui répondra peut-être à ta question sur le parcours de répertoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ ls -R
    .:
    rep1  rep2
     
    ./rep1:
    fic1  fic2  fic3  fic4
     
    ./rep2:
    fic2  fic3  fic4  fic5
    $ echo $ch1
    fic1
    $ [ -f $ch1 ] && echo ok || echo ko
    ko
    $ [ -f rep1/$ch1 ] && echo ok || echo ko
    ok
    $ [ -f rep2/$ch1 ] && echo ok || echo ko
    ko

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 870
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ echo $ch1
    fic1
    $ [ -f $ch1 ] && echo ok || echo ko
    ko
    Attention à essayer de donner aussi les bonnes habitudes. Notemment celle de protéger une variable sensée contenir une chaine avec des doubles quottes. Ca évite les petits bugs de ce type...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ unset ch
    $ echo "[$ch]"
    []
    $ test -f $ch && echo "ok" || echo "ko"
    ok
    $ test -d $ch && echo "ok" || echo "ko"
    ok
    $ test -p $ch && echo "ok" || echo "ko"
    ok


    Alors que si on veille à bien protéger sa variable...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ test -f "$ch" && echo "ok" || echo "ko"
    ko
    Ce qui va déjà beaucoup mieux...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 396
    Par défaut
    Il est vrai que j'aurai pu faire l'effort d'une écriture plus rigoureuse mais le but ici était de montrer la partie "parcours" de sa question et de plus, la variable est définie en absolue.
    Sinon, à bien l'écrire, autant être plus stricte pour éviter d'autres surprises (et ici, je ne parle que de la variable ).
    En gardant l'aborescence précédente et de savoir si le fichier "fic1" existe dans le répertoire rep1 (ce qui est le cas):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $ ch1="fic"
    $ [ -f "rep1/$ch11" ] && echo ok
    $ [ -f "rep1/${ch1}1" ] && echo ok
    ok
    $ [ -f "rep1/$ch1""1" ] && echo ok
    ok
    La deuxième écriture me semble plus propre, de plus si la valeur de la variable posséde un opérateur que l'on veut exploiter, les guillemets deviennent encombrant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ ch1="fi*"
    $ [ -f "rep1/"$ch1"1" ] && echo ok
    ok
    $ [ -f "rep1/$ch11" ] && echo ok
    $ [ -f "rep1/$ch1""1" ] && echo ok
    $ [ -f "rep1/${ch1}1" ] && echo ok
    $ [ -f "rep1/"${ch1}"1" ] && echo ok
    ok
    Comme on peut le voir, les seules écritures correctes sont la première et la dernière et ici les variables ne sont pas protégées par des guillemets.

    Je pense que la bonne écriture est difficile à définir, puisqu'elle dépends tout d'abord du contexte de son utilisation.

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 703
    Par défaut
    Bonjour,

    en bash ?
    l'astérisque n'est pas développé entre guillemets
    et, si plusieurs fichiers correspondent au «motif», et qu'on n'utilise pas de guillemets, la commande échoue avec un message :binary operator expected

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 870
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ [ -f "rep1/${ch1}1" ] && echo ok
    La deuxième écriture me semble plus propre
    Exact. C'est d'ailleurs le but premier des accolades: isoler le nom de la variable pour éviter une ambigüité possible. Et les guillemets (même si ici on peut les enlever) ne gênent en rien quand on les laisse. Autant alors les laisser pour éviter le cas de la chaine vide et avoir un shell fonctionnel dans 100% des cas.
    On pourrait même aller plus loin et dire qu'on devrait toujours mettre aussi des accolades. Cependant, j'ai essayé une fois et ça devient franchement lourd à écrire et aussi à relire...

    Citation Envoyé par disedorgue Voir le message
    de plus si la valeur de la variable posséde un opérateur que l'on veut exploiter, les guillemets deviennent encombrant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ ch1="fi*"
    $ [ -f "rep1/"$ch1"1" ] && echo ok
    ok
    $ [ -f "rep1/$ch11" ] && echo ok
    $ [ -f "rep1/$ch1""1" ] && echo ok
    $ [ -f "rep1/${ch1}1" ] && echo ok
    $ [ -f "rep1/"${ch1}"1" ] && echo ok
    ok
    Comme on peut le voir, les seules écritures correctes sont la première et la dernière et ici les variables ne sont pas protégées par des guillemets.
    Oui mais là tu as testé le cas très très très particulier d'un métacaractère qui, comme l'a dit N_Bah, n'est "métamorphosée" qu'au moment où elle est vue par le shell sans guillemets.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ ls
    fi1  fi2
    $ ch="fi*"
    $ echo "$ch"
    fi*
    $ echo $ch
    fi1 fi2

    Et en plus, qu'au moment où il est non pas écrit mais au moment où il doit être lu
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ ch=fi*                        # Sans guillemet, l'étoile n'est pas protégée...
    $ echo "$ch"                        # Ben pourtant elle n'a pas été encore transformée
    fi*
    $ echo $ch
    fi1 fi2
    $ touch fi3
    $ echo $ch
    fi1 fi2 fi3
    $
    Bien évidemment, traiter le cas de ce caractère inhibé par les guillemets devient alors beaucoup plus difficile. Accessoirement je ne peux pas parler de façon absolue mais intuitivement j'ai l'impression qu'il vaut mieux écrire des scripts où l'étoile ne sera pas dans la variable mais dans l'expression testée...

    Citation Envoyé par disedorgue Voir le message
    Je pense que la bonne écriture est difficile à définir, puisqu'elle dépends tout d'abord du contexte de son utilisation.
    C'est sûr que quand la variable possède un métacaractère dont l'action est inhibée par des guillemets, l'utilisation de guillemets est alors plus problématique. Mais j'espère que tu conviendras honnêtement que ce dernier cas est rarissime...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 396
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    On pourrait même aller plus loin et dire qu'on devrait toujours mettre aussi des accolades. Cependant, j'ai essayé une fois et ça devient franchement lourd à écrire et aussi à relire...
    Je ne te contredirais pas là-dessus

    Citation Envoyé par Sve@r Voir le message
    Bien évidemment, traiter le cas de ce caractère inhibé par les guillemets devient alors beaucoup plus difficile. Accessoirement je ne peux pas parler de façon absolue mais intuitivement j'ai l'impression qu'il vaut mieux écrire des scripts où l'étoile ne sera pas dans la variable mais dans l'expression testée...


    C'est sûr que quand la variable possède un métacaractère dont l'action est inhibée par des guillemets, l'utilisation de guillemets est alors plus problématique. Mais j'espère que tu conviendras honnêtement que ce dernier cas est rarissime...
    Là, j'aimerais bien que le vieux bonhomme à la barbe blanche t'entende, mais il semble être de plus en plus dur de la feuille

Discussions similaires

  1. [FTP] Tester l'existence d'un fichier.
    Par antony dans le forum Langage
    Réponses: 2
    Dernier message: 03/03/2006, 19h54
  2. [File]Tester l'existence d'un fichier
    Par florantine dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 23/11/2005, 11h45
  3. tester l existence d un fichier sous turbo pascal
    Par Newllite dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 25/01/2004, 13h47
  4. Peut on tester l'existence d'un fichier ?
    Par Alamassepointcom dans le forum Flash
    Réponses: 2
    Dernier message: 10/10/2002, 13h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo