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 :

Comment modifier un fichier dans plusieurs répertoires ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Par défaut Comment modifier un fichier dans plusieurs répertoires ?
    Bonjour,

    D'avance je vous prie de m'excuser car je suis débutant !

    Voilà mon problème :
    J'ai une action répétitive à effectuer sur mon fichier httpd.conf et ce pour plusieurs machines et pour plusieurs instances apche. Je souhaite avoir votre aide pour écrire un script shell qui automatise tout cela :
    - remplacer ServerRoot "xxxx" par ServerRoot "yyyy" du fichier httpd.conf dans tous les répértoires: " /production/travail/NOM_INSTANCE/apache/conf/httpd.conf " où NOM_INSTANCE est le nom (variable !) de l'instance apache. Dans mon répertoire /production/travail/, j'ai des dizaines de répertoires "NOM_INSTANCE"...

    Merci de votre aide...

    Bras

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    En gros, quelque chose comme ça :

    Sur la liste des fichiers à modifier (avec find)
    Effectuer le remplacement de xxxx par yyyy (avec sed)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    En gros, quelque chose comme ça :

    Sur la liste des fichiers à modifier (avec find)
    Effectuer le remplacement de xxxx par yyyy (avec sed)
    Au fait je n'ai pas une liste de fichers mais un seul fichier à modifier qui est httpd.conf. Par contre, je dois aller dans plusieurs répértoires "NOM_INSTANCE" pour y effectuer la même modification. Et c'est l'une de mes difficulté : comment automatiser le fait d'aller dans chaque NOM_INSTANCE séparément pour effectuer la modification, sauvegarder mon fichier et redemarrer apache.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bras39 Voir le message
    Au fait je n'ai pas une liste de fichers mais un seul fichier à modifier qui est httpd.conf. Par contre, je dois aller dans plusieurs répértoires "NOM_INSTANCE" pour y effectuer la même modification. Et c'est l'une de mes difficulté : comment automatiser le fait d'aller dans chaque NOM_INSTANCE séparément pour effectuer la modification, sauvegarder mon fichier et redemarrer apache.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    modif_httpd()
    {
        # La fonction reçoit le nom complet à modifier en $1
        # Donc ici il faut écrire le code qui modifie $1 selon ce que tu dois faire
    }
     
    for rep in toto titi tata tutu
    do
        modif_httpd "/production/travail/$rep/apache/conf/httpd.conf"
    done
     
    /etc/init.d/apache2 restart
    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 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sed -i.bak 's/ancien/nouveau/' /production/travail/{toto,titi,tata,tutu}/apache/conf/httpd.conf
     
    /etc/init.d/apache2 restart
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    modif_httpd()
    {
        # La fonction reçoit le nom complet à modifier en $1
        # Donc ici il faut écrire le code qui modifie $1 selon ce que tu dois faire
    }
     
    for rep in toto titi tata tutu
    do
        modif_httpd "/production/travail/$rep/apache/conf/httpd.conf"
    done
     
    /etc/init.d/apache2 restart

    Mes excuses, je ne vois pas le code à mettre dans la fonction modif_httpd(), est-ce ce code là :
    sed -i.bak '/ ServerRoot "xxxx"/ServerRoot "yyyy"/' /production/travail/{toto,titi,tata,tutu}/apache/conf/httpd.conf

    ou bien la seule liste des répertoires {toto, titi...}, un par ligne ?

    Par ailleurs, y a-t-il un moyen qui permet de ne pas écrire en vrac la liste des répértoires, car j'en ai vraiment beaucoup ?

    Une dernière question : si j'ai un autre répértoire /exploitation/NOM_INSTANCE/..../httpd.conf où je dois effectuer la même modif que dans /production/travail/NON_INSTANCE/.../httpd.conf, comment mettre tout cela dans un seul script qu'on lance en une seule fois au lieu de créer un second script /exploitation/NOM_INSTANCE/.../httpd.conf ?

    Merci

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bras39 Voir le message
    Mes excuses, je ne vois pas le code à mettre dans la fonction modif_httpd() , est-ce ce code là :
    sed -i.bak '/ ServerRoot "xxxx"/ServerRoot "yyyy"/' /production/travail/{toto,titi,tata,tutu}/apache/conf/httpd.conf
    En fait j'avais pas bien lu et j'avais pas vu que la modif était juste de remplacer "ServerRoot xxxx" par "ServerRoot yyyy" mais on peut effectivement intégrer la ligne de commande de N_Bah dans mon script
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    modif_httpd()
    {
        sed -i.bak 's/ServerRoot "xxxx"/ServerRoot "yyyy"/' "$1"
    }
     
    for rep in toto titi tata tutu
    do
        modif_httpd "/production/travail/$rep/apache/conf/httpd.conf"
    done
     
    /etc/init.d/apache2 restart


    Ou supprimer la fonction qui ne fait qu'une action et intégrer l'action directement dans le corps du for
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for rep in toto titi tata tutu
    do
        sed -i.bak 's/ServerRoot "xxxx"/ServerRoot "yyyy"/' "/production/travail/$rep/apache/conf/httpd.conf"
    done
     
    /etc/init.d/apache2 restart

    Mais je pense que la commande de N_Bah (qui m'impressionne généralement par ses raccourcis qu'il utilise) fait en une seule et unique ligne ce que fait tout mon script...

    Citation Envoyé par bras39 Voir le message
    Par ailleurs, y a-t-il un moyen qui permet de ne pas écrire en vrac la liste des répértoires, car j'en ai vraiment beaucoup ?
    Tu peux mettre la liste de tes répertoires dans un fichier qui se nommerait par exemple "listeRep". Le script donnerait alors ceci

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cat listeRep | while read rep
    do
        sed -i.bak 's/ServerRoot "xxxx"/ServerRoot "yyyy"/' "$rep/apache/conf/httpd.conf"
    done
     
    /etc/init.d/apache2 restart

    Ou alors, s'il s'agit de tous les répertoires situés dans /production/travail, passer par un ls (je sais que N_Bah adore )
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ls /production/travail | while read rep
    do
        sed -i.bak 's/ServerRoot "xxxx"/ServerRoot "yyyy"/' "$rep/apache/conf/httpd.conf"
    done
     
    /etc/init.d/apache2 restart


    Citation Envoyé par bras39 Voir le message
    Une dernière question : si j'ai un autre répértoire /exploitation/NOM_INSTANCE/..../httpd.conf où je dois effectuer la même modif que dans /production/travail/NON_INSTANCE/.../httpd.conf, comment mettre tout cela dans un seul script qu'on lance en une seule fois au lieu de créer un second script /exploitation/NOM_INSTANCE/.../httpd.conf ?
    Pas de pb

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ls /production/travail /exploitation | while read rep
    do
        sed -i.bak 's/ServerRoot "xxxx"/ServerRoot "yyyy"/' "$rep/apache/conf/httpd.conf"
    done
     
    /etc/init.d/apache2 restart
    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. Réponses: 2
    Dernier message: 24/10/2008, 09h00
  2. Réponses: 3
    Dernier message: 30/05/2008, 10h39
  3. Réponses: 6
    Dernier message: 15/02/2008, 11h10
  4. Réponses: 1
    Dernier message: 30/10/2007, 00h07
  5. Réponses: 1
    Dernier message: 27/08/2007, 14h01

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