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

Unix Discussion :

argument de fonction recursive "perdu"


Sujet :

Unix

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut argument de fonction recursive "perdu"
    Bonjour,

    Je reprends un peu le shell bash pour faire un "mini" script qui ajoute un préfixe à tous mes fichiers à partir d'un répertoire courant.
    J'imagine qu'il y a certainement plus court que ce que j'ai fait, mais bon !!

    Mon problème est que le préfixe utilisé ne correspond pas à ce que je veux, est-ce dû à la récursivité de la fonction parse_rep ?

    ci-joint mon code:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    #!/usr/bin/bash
     
    # usage mv_fic.sh REPERTOIRE EXTENSION [RECURSION]
     
    # Ajoute à tous les fichiers du repertoire $DIR, l'extension "$EXTENSION_" devant.
    # Par exemple sur l'instruction : mv_fic.sh `pwd` L2 kkk
    # alors "toto.mp3" devient "L2_toto.mp3"
     
    # definition de la fonction parse_rep
    function parse_rep
    {
    	echo "Entree dans la fonction avec le param : $1"
    	echo "Travaille dans : $2"
    	echo "Ajout de l'extension : $3"
     
    	# Rentrer dans le repertoire passe en argument
    	cd $2
     
    	# Recuperer le nom des fichiers
    	LIST_FIC_TEMP=`/bin/ls`
     
    	# Creer une liste de repertoires
    	LIST_REP=""
     
    	# Changer d'abord tous les noms des fichiers
    	for FIC_TEMP in $LIST_FIC_TEMP
    	do
    		if [ -f $FIC_TEMP ]
    		then
    			# Si c'est un fichier : changer son nom
    			echo "$FIC_TEMP ==> $3_$FIC_TEMP"
    		elif [ -d $FIC_TEMP ]
    		then
    			# Si c'est un repertoire : faire une liste
    			echo "REP TROUVE : $FIC_TEMP"
    			LIST_REP="$LIST_REP $FIC_TEMP"
    		fi
    	done
     
    	echo "Voici la liste des repertoires : $LIST_REP"
     
    	# Ensuite rentrer dans les sous-repertoires
    	for REP_TEMP in $LIST_REP
    	do
    		if [ -d $REP_TEMP ]
    		then
    			CURRENT_REP=`pwd`
    			parse_rep $CURRENT_REP $REP_TEMP $3
    		fi
    	done
     
    	# Enfin sortir du repertoire
    	cd ..
    }
     
    PATH=`pwd`
    echo "Execution a partir du repertoire :"
    pwd
    echo ""
    echo ""
     
    RECURSIF="NON"
     
    # verification qu'il y a bien 2 ou 3 arguments
    if [ $# -lt 2 ]
    then
    	echo "Il manque des arguments"
    	echo "Erreur : Sortie de programme"
    	exit 1
    elif [ $# -gt 3 ]
    then
    	echo "Il y a trop d'arguments"
    	echo "Erreur : Sortie de programme"
    	exit 1
    elif [ $# == 2 ]
    then
    	echo "Pas de recursivite"
    else
    	RECURSIF="OUI"
    fi
     
    DIR=$1
    EXTENSION=$2
     
    echo "DIR : $DIR"
    if [ -d $DIR ] && [ -n $DIR ]
    then
    	cd $DIR
    	echo "Changement de repertoire :"
    	pwd
    	echo ""
    	echo ""	
    else
    	echo "\"$1\" : n'est pas un repertoire"
    	exit 
    fi
     
    echo "Script recursif : $RECURSIF"
     
    if [ $RECURSIF == "NON" ]
    then
    	# Recuperation de tous les fichiers dont il faut modifier le nom
    	LIST_FIC=`/bin/ls`
     
    	# Ajout de l'extension pour tous les fichiers
    	for FIC in $LIST_FIC
    	do
    		echo "$FIC : renome en $EXTENSION_$FIC"
    		#/bin/mv $FIC "$EXTENSION_$FIC"
    	done
     
    else
    	# Recuperation de tous les fichiers
    	LIST_FIC_TEMP=`/bin/ls`
     
    	# Parser le repertoire courant
    	parse_rep $LIST_FIC_TEMP "." "$EXTENSION"
     
    fi
     
    cd $PATH
    echo "Retour au repertoire courant :"
    pwd
    echo ""
    echo ""
     
    echo "Script termine correctement"
    Merci pour vos remarques

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    C'est ${EXTENSION}_$FIC et pas $EXTENSION_$FIC.

    En passant, si tu pouvait expliquer ce que ton script fait d'incorrect, ça pourrait nous aider. Parce que "le préfixe utilisé ne correspond pas à ce que je veux", c'est un peu flou.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par matafan Voir le message
    En passant, si tu pouvait expliquer ce que ton script fait d'incorrect, ça pourrait nous aider. Parce que "le préfixe utilisé ne correspond pas à ce que je veux", c'est un peu flou.
    Lors du lancement du script avec l'instruction :
    je souhaite modifier tous les noms de fichiers du répertoire courant et des sous-répertoire par L2_nomDuFichier, mais je ne sais pas pourquoi le préfixe "L2" utilisé dans la ligne de commande n'a pas l'air d'être correctement passé à la fonction "parse_rep", effectivement une fois dans cette fonction la variable $3 ne contient pas la préfixe "L2", ma question est pourquoi ?

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Est-ce que tu as lu la première partie de ma réponse ? Ce n'est pas $3_$FIC_TEMP mais ${3}_$FIC_TEMP

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    C'est un bug de débutant , le premier argument passé à la fonction est une liste d'élément, du coup $1 est le premier élément de la liste, $2 le deuxième... il suffit de changer l'ordre des arguments de la fonction.

    Merci à matafan

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SimpleXML] " perdu
    Par Spir dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 09/12/2008, 14h17

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