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 :

Opérations sur des répertoires via la boucle for


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Par défaut Opérations sur des répertoires via la boucle for
    Bonjour,

    Je cherche à effectuer des opérations dans des répertoires listés par un find au moyen d'une boucle for.

    Voici ce que j'ai :

    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
    PROJET_DIR=/home/toto/projet/
    list=`find $PROJET_DIR -type d -name templates`
    for i in "$list"
    do
    
      # me rendre dans le répertoire parent de $i
      # (celui qui contient le répertoire "templates")
      cd # la suite ?
    
      # Création d'un fichier dans ce répertoire parent
      # (qui sera donc situé au même niveau que "templates")
      touch # la suite ?
    
      # Manipulation sur ledit fichier
      # Là, ça devrait aller ;)
    
    done
    Comment parvenir à effectuer les deux opérations (cd et touch) ?

    J'ai essayé avec des ", des ', des ` mais je ne trouve pas la bonne solution...

    Merci d'avance pour vos idées.

    FG

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Par défaut
    tout simplement :

    PROJET_DIR=/home/toto/projet/
    list=`find $PROJET_DIR -type d -name templates`
    for i in "$list"
    do

    # me rendre dans le répertoire parent de $i
    # (celui qui contient le répertoire "templates")
    cd $i
    cd .. #ça doit se faire en 1 fois mais je suis pressé

    # Création d'un fichier dans ce répertoire parent
    # (qui sera donc situé au même niveau que "templates")
    touch name

    # Manipulation sur ledit fichier
    # Là, ça devrait aller

    done

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/toto/projet/ -type d -name templates --execdir touch {}/name \;
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ashin Voir le message
    tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PROJET_DIR=/home/toto/projet/
    list=`find $PROJET_DIR -type d -name templates`
    for i in "$list"
    do
     
      # me rendre dans le répertoire parent de $i
      # (celui qui contient le répertoire "templates")
      cd $i
    HYPER DANGEREUX !!!
    Là ca marche parce que le chemin est en absolu. Mais ce chemin paramétrable (donc fait pour être changé rapidement) peut un jour devenir relatif. Et là, crash assuré

    Perso, j'aime pas faire du cd dans mes scripts. Mais si vraiment on y est obligé, alors 2 façons de faire
    1) mémoriser le répertoire courant et y revenir après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pwd=`pwd`
    cd ...
    <...travail...>
    cd "$pwd"
    2) mettre le code du travail dans un environnement fils
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (
        cd ...
        <...travail...>
    )
    Accessoirement, le "for i in $list" est aussi à éviter car si un des noms issus du find contient un espace...
    Mieux vaut lui préférer la syntaxe "find ... |while read i"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PROJET_DIR=/home/toto/projet/
    find $PROJET_DIR -type d -name templates |while read file
    do
        # Création du fichier
        touch "$file/../name"
     
        # Manipulation du fichier. Là ça devrait aller...
    done
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/toto/projet/ -type d -name templates --execdir touch {}/name \;
    Je ne suis pas familier avec le execdir mais il me semble que la commande s'exécute dans le dossier ciblé. Dans ce cas, les accolades (représentant elles-aussi le dossier ciblé) sont inutiles non ???
    De plus, le fichier doit être créé un niveau au dessus. Donc moi je mettrais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/toto/projet/ -type d -name templates --execdir touch ../name \;
    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]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bash dispose d'une variable $OLDPWD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    pwd
    /home/toto
    cd autreRepertoire; pwd
    /home/toto/autreRepertoire
    echo $OLDPWD
    /home/toto
    cd $OLDPWD; pwd
    /home/toto
    echo $OLDPWD
    /home/toto/autreRepertoire

    J'ai compris que kinder_pingui veut se déplacer jusqu'aux répertoires templates pour y créer un fichier. La commande que j'ai fournie fonctionne dans ce sens. Mais effectivement, en relisant son message, je m'aperçois que j'ai fait une erreur.
    Donc je corrige :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/toto/projet -type d -name templates -execdir touch nouveauFichier \;
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bash dispose d'une variable $OLDPWD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    pwd
    /home/toto
    cd autreRepertoire; pwd
    /home/toto/autreRepertoire
    echo $OLDPWD
    /home/toto
    cd $OLDPWD; pwd
    /home/toto
    echo $OLDPWD
    /home/toto/autreRepertoire
    Ouaip. Comme mes scripts doivent être portable, je les écris généralement en Bourne Shell et j'ai pas pensé à ce $OLDPWD du bash

    D'ailleurs il me semble même qu'il existe pushd et popd permettant d'aller dans un dossier X et de revenir ensuite au point de départ. Mais j'en reviens à ma phrase initiale => dans 99,9% des cas, le déplacement est inutile...
    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]

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Par défaut
    Bonjour et merci pour les suggestions !

    Après quelques essais, le script qui me semble le plus adapté est celui suggéré par Sve@r :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PROJET_DIR=/home/toto/projet/
    find $PROJET_DIR -type d -name templates |while read file
    do
        # Création du fichier
        touch "$file/../name"
     
        # Manipulation du fichier. Là ça devrait aller...
    done
    Encore merci à tous.

    FG

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

Discussions similaires

  1. [Batch] Gérer les espaces des élèments via le boucle for
    Par Olivier Regnier dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 21/01/2013, 22h03
  2. Réponses: 2
    Dernier message: 07/06/2010, 14h19
  3. [MySQL] Traitement des variables d'une boucle for
    Par liryc78 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/03/2006, 20h53
  4. opération sur les répertoires
    Par mister3957 dans le forum C++
    Réponses: 7
    Dernier message: 26/02/2006, 19h47
  5. Opération sur des heures dans Excel
    Par mirascheat dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/12/2005, 10h34

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