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

  1. #21
    Membre du Club
    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
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    En faisant un man sed sur Solaris, tu constateras sans doute que l'option -i n'est prise en charge.

    Il ne reste plus qu'à rediriger la sortie de sed vers un fichier temporaire et remplacer le fichier d'origine par le temporaire pour la suite du traitement.
    Bonjour,

    J'avais bien vu que le "-i" ne marche pas. Mais comment faire ce que tu décris ici : "ediriger la sortie de sed vers un fichier temporaire et remplacer le fichier d'origine par le temporaire pour la suite du traitement."? C'est un peu compliqué notamment avec la boucle do, de l'aide SVP...

  2. #22
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 742
    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 742
    Points : 31 072
    Points
    31 072
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bras39 Voir le message
    Mais comment faire ce que tu décris ici : "rediriger la sortie de sed vers un fichier temporaire
    Te faudrait quand-même apprendre les bases des processus et notamment les redirections !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ... fichier >/tmp/work_$$
    Citation Envoyé par bras39 Voir le message
    et remplacer le fichier d'origine par le temporaire pour la suite du traitement."? C'est un peu compliqué
    Faut quand-même pas pousser là !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv /tmp/work_$$ fichier
    Citation Envoyé par bras39 Voir le message
    notamment avec la boucle do, de l'aide SVP...
    La boucle "do" n'influe pas sur la façon de faire. Elle sert juste à énumérer les fichiers à traiter puis ensuite, le code situé dans la boucle ne travaille que sur un fichier à la fois...

  3. #23
    Membre du Club
    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
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Te faudrait quand-même apprendre les bases des processus et notamment les redirections !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ... fichier >/tmp/work_$$

    Faut quand-même pas pousser là !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mv /tmp/work_$$ fichier

    La boucle "do" n'influe pas sur la façon de faire. Elle sert juste à énumérer les fichiers à traiter puis ensuite, le code situé dans la boucle ne travaille que sur un fichier à la fois...

    Bonjour à tous,


    Pour les Solaris, j'ai finalement préféré l'utilisation de la méthode Perl suivante qui remplace, cherche et supprime 2 lignes "in-place" sur la méthode du fichier temporaire que vous m'avez très aimablement proposée (je vous en remercie) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for rep in /production/travail/*/apache2
    do
    cp "$rep/conf/httpd.conf" "$rep/conf/httpd.conf.$(date '+%F%H%M')"; perl -ni -e 's/^ServerRoot.*"xxxx"$/ServerRoot "yyyy"/; /^(?:MaxClients.*50|ServerTokens.*production)$/ or print' "$rep/conf/httpd.conf"
    done
    Même méthode, mais pour les Linux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for rep in /production/travail/*/apache2/
    do
        sed -i.$(date '+%F%H%M') -e 's/^ServerRoot.*"xxxx"$/ServerRoot "yyyy"/' -e '/^MaxClients.*50$/d' -e '^ServerTokens.*production$/d' "$rep/conf/httpd.conf"
    done
    Mais comment je peux regrouper ces deux bouts de script dans un seul qui soit capable de distinguer entre une machine Solaris et une machine linux et exécuter ensuite le script approprié, sachant que je dois exécuter le script final à distance sur une liste de machines contenant uniquement des Linux et des Soalaris ?

    Je me dit que ça doit-être quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/sh
    if ("machine est un Solaris") then
               <exécute le script des Solaris> 
    else
              <exécute le script des Linux>
    endif
    Mais je ne sais pas comment choisir judicieusement le : "machine est un Solaris" (je peux aussi inverser et tester en cherchant d'abord si la machine est un linux : "machine est un Linux", cela n'a pas d'importance). L'essentiel est d'être vraiment certain qu'il s'agit bel et bien d'une machine Solaris ou d'une machine Linux....

    Une dernière petite question : savez-vous pourquoi, contrairement à Linux, Solaris n'aime pas (ou interprète) le "/" après le répertoire "apache2"?

    D'avance merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 482
    Points
    19 482
    Par défaut
    Citation Envoyé par bras39
    Mais comment je peux regrouper ces deux bouts de script dans un seul qui soit capable de distinguer entre une machine Solaris et une machine linux et exécuter ensuite le script approprié, sachant que je dois exécuter le script final à distance sur une liste de machines contenant uniquement des Linux et des Soalaris ?
    c'est là qu'intervient la norme POSIX : si tu dois travailler dans des environnements différents, tes scripts doivent scrupuleusement respecter cette norme (donc ne pas utiliser les extensions GNU, ou autres, aux programmes), et n'utiliser que les options que tous les systèmes reconnaîtront.

  5. #25
    Membre du Club
    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
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    c'est là qu'intervient la norme POSIX : si tu dois travailler dans des environnements différents, tes scripts doivent scrupuleusement respecter cette norme (donc ne pas utiliser les extensions GNU, ou autres, aux programmes), et n'utiliser que les options que tous les systèmes reconnaîtront.
    Bonjour,

    Je me posais efectivement cette question que j'allais même poser sur ce forum suite au problème que j'ai rencontré (j'y reviendrai lorsque j'aurais bien progressé en programmation Shell).

    Mais pour le moment, comment je peux m'en sortir avec les 2 bouts de code déjà sous la main?

    En vous remerciant.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 482
    Points
    19 482
    Par défaut
    utilise sed sur les deux plateformes; simplement, n'utilise pas l'option -i de sed qui est une extension GNU.

  7. #27
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 742
    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 742
    Points : 31 072
    Points
    31 072
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bras39 Voir le message
    Mais comment je peux regrouper ces deux bouts de script dans un seul qui soit capable de distinguer entre une machine Solaris et une machine linux et exécuter ensuite le script approprié, sachant que je dois exécuter le script final à distance sur une liste de machines contenant uniquement des Linux et des Soalaris ?

    Je me dit que ça doit-être quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/sh
    if ("machine est un Solaris") then
               <exécute le script des Solaris> 
    else
              <exécute le script des Linux>
    endif
    Mais je ne sais pas comment choisir judicieusement le : "machine est un Solaris" (je peux aussi inverser et tester en cherchant d'abord si la machine est un linux : "machine est un Linux", cela n'a pas d'importance). L'essentiel est d'être vraiment certain qu'il s'agit bel et bien d'une machine Solaris ou d'une machine Linux....
    Salut

    Comme N_BaH t'a dit, si tu restes standard t'as pas besoin de différencier Solaris/Linux. Mais si vraiment il le faut, tu peux alors voir du coté de la commande uname
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    case `uname -...` in
        linux)
             code Linux
             ;;
        solaris)
             code Solaris
             ;;
        *)
             code autre os
    esac

    Citation Envoyé par bras39 Voir le message
    Une dernière petite question : savez-vous pourquoi, contrairement à Linux, Solaris n'aime pas (ou interprète) le "/" après le répertoire "apache2"?
    Généralement, nommer un dossier "dossier" ou "dossier/" n'influe pas. Maintenant faudrait voir dans quelles circonstances tu as détecté ce fait...

  8. #28
    Membre du Club
    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
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Généralement, nommer un dossier "dossier" ou "dossier/" n'influe pas. Maintenant faudrait voir dans quelles circonstances tu as détecté ce fait...
    Bonjour et Merci de ta réponse !

    Les circonstances (qui ne concernent que les machines Solaris), sont :

    Si je laisse : "for rep in /production/travail/*/apache2/", c'est à dire avec le "/" après "apache2", j'ai une erreur pour chaque instance disant qu'il ne trouve pas les répertoires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    production/travail/*/apache2//conf/httpd.conf
    Vous remarquerez ici le présence de ce "//" !

    Si j'enlève le "/", ça passe sans problème. Et sur les machines Linux, la présence du "/", ne pose aucun problème...


    Merci.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/10/2008, 10h00
  2. Réponses: 3
    Dernier message: 30/05/2008, 11h39
  3. Réponses: 6
    Dernier message: 15/02/2008, 12h10
  4. Réponses: 1
    Dernier message: 30/10/2007, 01h07
  5. Réponses: 1
    Dernier message: 27/08/2007, 15h01

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