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 :

Problème de boucle sur les sorties d'un find


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1
    Par défaut Problème de boucle sur les sorties d'un find
    Bonjour à tous,

    J'essaye de réaliser un script en shell pour générer un .csv à partir d'une arborescence remplie de .flac

    En gros, j'interroge les métadonnées des fichiers flac à l'aide de metaflac (fourni dans le pack flac), et je fais un echo pour écrire ma ligne dans un .csv

    Le seul soucis est d'appliquer cette solution à une arborescence et non pas à un seul dossier. Je débute en ksh, je vous colle mon code pour illustrer mais je sais déjà qu'il y a des erreurs dans le echo pour le retour à la ligne et puis forcément une erreur pour la boucle que j'espérais faire fonctionner comme en php:

    Code bash : 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
    #!/bin/bash
    # Script de test pour lister les informations des tags des fichiers *.flac
    # 
    #
    #Test fonction
    echo "Veuillez entrer le chemin de la base musicale:"
    read musica_path
    echo "Le chemin est: "$musica_path
    cd "$musica_path"
    while (find . -name "*.flac") ;do
    ALBUMARTIST=`metaflac --no-filename --show-tag=ALBUMARTIST $0 |awk -F = '{ print $2 }'`
    ALBUM=`metaflac --no-filename --show-tag=ALBUM $0 |awk -F = '{ print $2 }'`
    YEAR=`metaflac --no-filename --show-tag=YEAR $0 |awk -F = '{ print $2 }'`
    GENRE=`metaflac --no-filename --show-tag=GENRE $0 |awk -F = '{ print $2 }'`
    TRACKNUMBER=`metaflac --no-filename --show-tag=TRACKNUMBER $0 |awk -F = '{ print $2 }'`
    TITLE=`metaflac --no-filename --show-tag=TITLE $0 |awk -F = '{ print $2 }'`
    echo "$ALBUMARTIST;\n$ALBUM;\n$YEAR;\n$GENRE;\n$TRACKNUMBER;\n$TITLE"
    done

    Merci de me donner votre avis
    NB: la séquence de commande metaflac ....|awk.... fonctionne très bien

  2. #2
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    Bonjour,
    essaies ceci
    Code bash : 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
    #!/bin/bash
    # Script de test pour lister les informations des tags des fichiers *.flac
    # 
    #
    #Test fonction
    echo "Veuillez entrer le chemin de la base musicale:"
    read musica_path
    echo "Le chemin est: "$musica_path
    cd "$musica_path"
    for i in $(find . -type f -name "*.flac") ;do
    ALBUMARTIST=`metaflac --no-filename --show-tag=ALBUMARTIST "$i" |awk -F = '{ print $2 }'`
    ALBUM=`metaflac --no-filename --show-tag=ALBUM "$i" |awk -F = '{ print $2 }'`
    YEAR=`metaflac --no-filename --show-tag=YEAR "$i" |awk -F = '{ print $2 }'`
    GENRE=`metaflac --no-filename --show-tag=GENRE "$i" |awk -F = '{ print $2 }'`
    TRACKNUMBER=`metaflac --no-filename --show-tag=TRACKNUMBER "$i" |awk -F = '{ print $2 }'`
    TITLE=`metaflac --no-filename --show-tag=TITLE "$i" |awk -F = '{ print $2 }'`
    echo -e "$ALBUMARTIST;\n$ALBUM;\n$YEAR;\n$GENRE;\n$TRACKNUMBER;\n$TITLE"
    done
    Par contre, je n'ai pas pris le temps de le changer, mais tu devrais éviter de choisir des noms de variables en majusucles
    Par exemple, tu devrais remplacer les TITLE par title, les GENRE par genre, etc etc ...
    Si tu veux utiliser les tabulation "\t" et/ou les retours à la ligne "\n" ... il faut utiliser l'option -e dans la commande "echo"
    Cordialement,
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  3. #3
    Membre éclairé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Par défaut
    Si je ne me trompe pas le script encadré par () est exécuté dans un processus séparé... ça ne me paraît pas très sain.
    J'utiliserais plutôt des quotes ``.

    Sinon j'écrirai une fonction qui retourne les info d'un fichier passé en paramètre et l'option -exec de find.

  4. #4
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    oups, j'ai oublié le $ dans le script que je t'a filé ... par contre ce que je t'ai donné est très sain. J'ai mis à jour mon post.
    var=$(which echo) et var=`which echo` c'est pareil.
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    non. for item in $(commande) n'est pas à préconiser (je n'explique plus pourquoi).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    shopt -s globstar
    for f in ./**/*.flac
    do : ...
    done
    quelle serait la sortie de metaflac ? Il semble possible de lui faire sortir les champs désirés par un seul appel à cette commande.
    La sortie serait lue dans un tableau, qui serait ensuite affiché dans le format souhaité...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    En effet, je n'aurai d'ailleurs pas dû dire que c'était sain.
    Mais en fait, je voulais surtout faire comprendre que $(command) ou bien `command`créent tous les deux des sous process et non pas uniquement $(command)
    Mais faut éviter cela en effet même si c'est plus facile en terme d'écriture et de compréhension.
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

Discussions similaires

  1. boucle sur les champs dynamiques
    Par Anduriel dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 17/06/2006, 20h49
  2. [C#] Boucle sur les controles
    Par stailer dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/05/2006, 09h48
  3. [DOM] Problème d'accent sur les noms de fichier avec mon parseur
    Par ujoodha dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 06/04/2006, 22h55
  4. Macro sur Excel/Boucle sur les lettres
    Par life is magic dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/11/2005, 12h56

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