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 :

Parcourir récursivement des sous répertoires


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2013
    Messages : 24
    Points : 26
    Points
    26
    Par défaut Parcourir récursivement des sous répertoires
    Bonjour,

    J'ai un répertoire "data" qui peut contenir n sous-dossiers. Le dernier sous-dossier contient un fichier "config.yml" que je souhaite parser.
    Je ne vois pas ou se situe le problème.
    Merci de votre aide.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    #!/bin/sh
     
    fonction()
    {
    	home=$(pwd)
    	fichier="config.yml"
     
    	for i in `ls $home/data/*`
    	do
    		if [ -e $fichier ]
    		then
    			while read line
    			do
    				case $line in
    					*"jdkversion"*)
    						param=`echo $line | awk -F":" '{ print $2}'`
    						echo ${param}
    					;;
    				esac
    			done < $fichier
    		fi
    	done
    }
     
    fonction

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    5 895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 5 895
    Points : 15 436
    Points
    15 436
    Par défaut
    Bonjour,

    - home=$(pwd) est inutile : il existe $HOME, ou $PWD.
    - on ne parcourt pas la sortie d'une commande avec une boucle for, parce que for lit des mots, pas des lignes.
    - on n'utilise plus `, et on évite de mélanger l'emploi de $() et `.
    - on n'utilise pas ls dans un script; parce que c'est inutile (une boucle for sur le Développement des chemins (cf. man bash) fait mieux le travail en protégeant les caractères de l'IFS)
    - il faut toujours mettre les variables entre guillemets. TOUJOURS; à moins de savoir pourquoi !!!

    avant de répondre, il faut qu'on sache :
    /bin/sh c'est parce que tu dois rester strictement POSIX, ou parce que tu ne sais pas que /bin/sh n'est pas la même chose que /bin/bash ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 4 161
    Points : 10 271
    Points
    10 271
    Par défaut
    Bonjour

    À noter : un site de vérification de syntaxe shell : https://www.shellcheck.net/

    J'ai bien ri quand il a dit que la variable "i" de la boucle n'était utilisée nulle-part.
    Relis ton code.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Membre averti Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    juillet 2017
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : juillet 2017
    Messages : 133
    Points : 380
    Points
    380
    Par défaut
    Ça sera toujours intéressant pour toi de corriger ton code bash, mais en gros, j'ai l'impression que tu peux le remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ~/data -type f -name 'config.yml' -print0 | xargs -0 awk -F':' '/jdkversion/{print FILENAME ": " $2}'

  5. #5
    Expert éminent Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    3 401
    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 : 3 401
    Points : 9 834
    Points
    9 834
    Par défaut
    Ou en bash, avec une boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    shopt -s globstar
    for i in "$HOME"/**/config.yml
    do
      awk -F':' '/jdkversion/{print FILENAME ": " $2}' "$i"
    done
    Cordialement.

Discussions similaires

  1. Comptage des sous-répertoires d'un répertoire
    Par GBAGO dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/09/2007, 16h11
  2. Réponses: 6
    Dernier message: 29/05/2007, 14h33
  3. Réponses: 6
    Dernier message: 25/10/2006, 22h00
  4. Recherche de fichiers dans des sous répertoires
    Par Mimi Bulles dans le forum Langage
    Réponses: 8
    Dernier message: 25/04/2006, 17h41
  5. fichier .bat : problèmes avec des sous-répertoires
    Par aymron dans le forum Windows
    Réponses: 4
    Dernier message: 23/06/2005, 10h33

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