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 POSIX Discussion :

Comment afficher les noms des sous-répertoires (et pas des fichiers) ?


Sujet :

Shell et commandes POSIX

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Comment afficher les noms des sous-répertoires (et pas des fichiers) ?
    Bonjour,

    je suis débutant en UNIX et du coup j'ai énormément de mal à répondre à cette question, voici l'intitulé :

    "Avec une boucle for, programmez une commande qui affiche les noms des sous-répertoires (et pas des fichiers) d'un répertoire donné en paramètre."

    Merci d'avance

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    3 choses.

    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Bonjour,

    Je suis d'accord avec Flodelarab concernant le professeur...

    Et pourquoi utiliser for alors qu'un printf du bash configuré en conséquence suffit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    shopt -s globstar
    printf "%s\n" "$1"/**/
    Cordialement.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    bonjour,

    Flodelarab;Bonjour [*]Pour vérifier la réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find le_repertoire_choisi -type d
    Ici avec maxdepth 1, je pense que c'est mieux

    [*]Une boucle for est une boucle à utiliser quand on connaît le nombre d'itérations.

    Je ne comprends pas, tu peux expliciter?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in * ; do [ -d "$i" ] && echo "$i"; done

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Je ne comprends pas, tu peux expliciter?
    Je comprends bien ton objection.
    Mais l'étoile est interprétée avant d'être donnée à la boucle for.
    Rien n'est inconnu au début de la boucle.
    Ce qui cache la conception douteuse.
    On peut faire de tout dans tout. Un langage peut supprimer le "while" et ne garder que le "for", ou inversement garder le "while" et supprimer le "for". On peut même faire des branchements inconditionnels, à base de GOTO, pour se brancher de n'importe où, vers n'importe où, dans le code, comme dans les années 70, sans notion de "bloc" "for".

    Mais si on veut faire les choses propres, ce n'est pas bien d'inciter les élèves à faire des "for" pour toute répétition.
    Sinon, on voit des horreurs comme :

    La bonne question (manquante) aurait dû être : quelle est la condition d'arrêt ?
    Voire, quelle est la vraie condition d'arrêt ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Treqz Voir le message
    "Avec une boucle for, programmez une commande qui affiche les noms des sous-répertoires (et pas des fichiers) d'un répertoire donné en paramètre."
    Comme indiqué par d'autres, la boucle "for" n'est pas la bonne (et a fortiori la meilleure) solution.

    Cependant si le but de l'exercice est de voir une certaine manière de pratiquer une boucle "for", alors on peut faire quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dir=$1 # le répertoire donné en paramètre
     
    for f in "${dir}"/*
      do
      if ... tester si "${f}" est un répertoire (voir "man test")...
      then echo "${f}"
      fi
    done

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    On peut éviter le passage du test si on rajoute un '/' après '*'

    Autre question: doit-on prendre en compte les répertoire qui commence par un point '.' ?
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    ça n'empêche pas le test.
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for d in ./nExistePas/
    do
       test -d "$d" && echo "$d n'existe pas, ou n 'est pas un répertoire, mais ce n'est pas possible à cause du slash" || echo "$d n'existe pas"
    done
    en bash, cela peut effectivement être éviter en activant l'option shell (shopt) nullglob.
    mais ça n'existe pas en shell POSIX
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/05/2011, 14h24
  2. Réponses: 3
    Dernier message: 19/01/2010, 09h53
  3. Comment afficher les noms des personnes stockés ds un tableau?
    Par quaresma dans le forum Algorithmes et structures de données
    Réponses: 29
    Dernier message: 26/04/2008, 00h55
  4. comment afficher les noms de fichiers specifiques
    Par pictree dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 20/03/2008, 16h55
  5. Réponses: 3
    Dernier message: 11/07/2007, 10h10

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