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

Linux Discussion :

[Bash] Commande dans boucle for


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2002
    Messages : 28
    Points : 27
    Points
    27
    Par défaut [Bash] Commande dans boucle for
    salut à tous,

    Je débute en bash et j'ai 2 petites questions que j'ai pas réussi à résoudre hier soir.

    1) Je voudrais faire quelques traitements sur des fichiers textes répartis dans des dossiers et sous-dossiers.

    J'ai donc qq chose comme ça :
    for fichier in *.txt
    do
    #traitements des fichiers...
    done
    ce petit bout de script fonctionne bien pour traiter les fichiers txt qui se trouvent dans le même dossier que lui mais s'il y a des sous-dossier, les fichiers contenus dedans ne sont pas traités. Je voudrais donc faire un truc du genre :

    for fichier in "find . -name *.txt"
    do
    #traitements des fichiers...
    done
    ou qq chose comme ça mais la commande find n'est pas interprétée.
    La question est très simple, comment faire pour traiter aussi tous les sous-répertoires ?


    2) Dans les traitements dont je parle plus haut, je voudrais extraire le nom du fichier sans extension et sans chemin. Je veux donc utiliser la commande basename mais je ne suis pas parvenu à l'utiliser

    #!/bin/bash

    for fichier in test/dossier1/*.txt
    do
    echo $fichier
    fichier2 ="basename $fichier .txt"
    done
    Avec ce script, j'ai une erreur : ./test.sh: line 6: fichier2 : commande introuvable
    J'ai essayé diverses combinaisons de la ligne 6 (avec ou sans guillemets) mais sans succès pour l'instant.

    Quelle est la bonne syntaxe dans ce cas ? La page de man de basename ne m'a pas aidé...

    Merci pour votre aide.

  2. #2
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    je ne connais pas bien bash mais j'imagine que c'est une chose du genre:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
     
    for fichier in `find . -name *.txt`
    do
    echo $fichier
    file2=`basename $fichier .txt`
    echo $file2
    done

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    salut
    Je pense que c'est mieux comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for fichier in $(find / -type f -iname "*.txt");do echo $fichier; done 2>/dev/null
    bonne journée

    EDIT: grillé

  4. #4
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    Oui mais ça repond pas à la question de slaborde
    l'utilisation de basname dans une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in $(find . -name *.txt); do echo $i; f2=`basename $i .txt`; echo $f2; done 2>/dev/null

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -iname "*.txt" -exec basename '{}' .txt \;
    !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    t'as raison c'est plus simple comme ça

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2002
    Messages : 28
    Points : 27
    Points
    27
    Par défaut basename
    Merci pour vos réponses, j'avais effectivement pas essayé les guillemets simples inversés...

    J'ai encore une question sur basename mais je vais changer de topic

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par slaborde Voir le message
    Merci pour vos réponses, j'avais effectivement pas essayé les guillemets simples inversés...
    C'est le mécanisme le plus puissant du shell. Il permet de substituer une commande par ce qu'elle affiche. Et cet affichage est réutilisé dans le script.
    Ainsi le shell n'a plus besoin de rien. Il peut faire traiter ce qu'il ne sait pas faire par d'autres programmes qui, eux, ne font qu'afficher leur résultat à l'écran sans se préoccuper de ce que deviendra ledit affichage.
    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]

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

Discussions similaires

  1. [bash] Récupérer valeur d'un argument dans boucle for
    Par lamingue dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 26/07/2012, 15h25
  2. [débutant] Pb dans boucle For
    Par Sam 069 dans le forum Access
    Réponses: 2
    Dernier message: 11/09/2006, 13h10
  3. Réponses: 3
    Dernier message: 04/08/2006, 19h24
  4. problème dans boucle for de lecture de fichier ini
    Par chourmo dans le forum Delphi
    Réponses: 3
    Dernier message: 06/07/2006, 09h31
  5. [JLabel] JLabel dans boucle for
    Par clairenes dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 06/01/2006, 00h47

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