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 :

Script pour exécuter plusieurs fois plusieurs programmes


Sujet :

Shell et commandes GNU

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut Script pour exécuter plusieurs fois plusieurs programmes
    Bonjour,

    J'aimerais faire tourner 3 programmes successifs (en fortran) et sauver tous les fichiers crées dans un répertoire propre (nommé models)
    à la fin de chaque itération, je dois ouvrir des fichiers de paramètres, en changer quelques un et relancer tout le bousin

    Pour ce faire j'ai commencé un script en bash

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    models="102 103 104"
    for model in $models
    do
    mkdir $model
    ../../bin/prog1
    ../../bin/prog2
    mpirun prog3
    done
    Je n'ai pas avancé beaucoup alors j'aurais 2 questions :

    - Comment envoyer directement les sorties de mes programmes dans le répertoire fraîchement crée (ex: 102, pour le 1er) en évitant les copié-collés

    - Comment ensuite changer un paramètre dans un fichier donnée ?

    Merci pour toutes aides, astuces ou conseils.

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

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

    Comment envoyer directement les sorties de mes programmes dans le répertoire fraîchement crée (ex: 102, pour le 1er) en évitant les copié-collés
    avec une redirection, en utilisant la variable...
    Comment ensuite changer un paramètre dans un fichier donnée ?
    'comprends pas

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,


    avec une redirection, en utilisant la variable...
    'comprends pas
    Bonjour,

    Quel genre de redirection ? car je ne peux pas utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ../../bin/prog1 > $model/result_prog1.txt
    car mes fichiers de sorties sont déjà nommés par le programme en question et peuvent eux même avoir des noms compliqués suivant les paramètres donnés.
    Il me faudrait un "truc" qui me disent

    "quelque soit les fichiers qui proviennent de cette ligne de commande je les met dans ce répertoire"

    Merci

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 418
    Par défaut
    Bonjour,

    Toujours rien compris du problème.

    Comment fais tu actuellement, à la main, pour résoudre ton problème ?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut
    je lance ces commandes successivement dans mon bash

    ../../bin/prog1
    ../../bin/prog2
    mpirun prog3

    le programme 1 me renvoi 4 fichiers utilisés dans le 2 qui lui même en sort 6 autres utilisés dans le prog 3 qui lui calcul tous résultats placés dans une multitude de fichiers.

    Ensuite je copie colle tous mes résultats dans un autre répertoire que je crée à main,
    je réédite 3 fichiers textes différents de paramètres qui sont utilisés par les 3 programmes,
    et je relance

    ../../bin/prog1
    ../../bin/prog2
    mpirun prog3

    et ainsi de suite

    C'est le programme 3 qui peut s'avérer très long, et c'est dans l'optique de faire bosser mon PC tout seul de nuit que j'aimerais faire un script pour qu'il puisse lancer les programmes > placer les fichiers dans un répertoire > changer les paramètres de fichiers d’initiation txt > relancer

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 724
    Par défaut
    ok, on va reprendre proprement :

    tant_que (tant que quoi ?)
    • édition de 3 fichiers paramètres (avec quelles données ?)
    • prog1 #crée 4 fichiers (quel est le format de leurs noms ?)
    • prog2 #crée 6 fichiers (idem)
    • prog3 # crée z fichiers (idem)
    • déplacement des z derniers fichiers (où ? et, que fait-on des 10 premiers ?)
    fin tant_que

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut
    ça serait plus un FOR qu'un WHILE, un for avec la liste de nom du numéro des mes modeles

    Pour les 3 fichiers paramètres, il simplement de changer quelques lignes comme par exemple
    0.005 #dt
    en une autre valeur:
    0.004 #dt
    mais limite ça c'est un second problème

    Les noms des fichiers textes crées sont trop complexes et ne peuvent en aucun cas être prédis par avance..

    Donc ta réponse m'indique clairement que c'est pas aussi simple que je l'avais pensé. On ne peut pas directement pointé sur les fichiers crées. ou alors il faudrait faire des copier/coller à la fin mais ce que je voulais éviter de faire pour ne pas perdre de temps.

    Peut être que le plus simple est de créer d'abord mes répertoires et d'y modifier dans chaque mes fichiers paramètres et de faire simplement tourner mes programmes dans ces répertoires

    Je vais essayer..

    Encore merci

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 418
    Par défaut
    Non, c'est peut-être faisable mais on n'a pas assez d'élément et de compréhension sur le besoin...

    Personnellement, je n'ai toujours pas compris mais c'est peut-être la fatigue ou la vieillerie

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Par défaut
    ou alors j'ai été trop précis et ajouter de la confusion.

    En faite dans l'idée c'est tout con:

    Je suis dans un répertoire avec mes 3 fichiers txt paramètres que je change à la main
    je lance les 3 commandes de programme successives qui vont me sortir tout plein de fichiers dans ce même répertoire
    et j'aimerais TOUT sauver dans un autre
    Ensuite revenir dans l'ancien répertoire, changer mes fichiers paramètres et tout relancer
    ETC.

    Donc j'imagine que le plus pratique c'est de lancer les prog > faire un CP de tout le répertoire vers un autre > Revenir ds le repertoire principal > changer mes fichiers paramètres > Relancer

    OU alors

    Créer avant tous les répertoires avec les fichiers paramètres déjà modifés dans chaque et lancer une boucle pour faire tourner les 3 programmes dans chacun des répertoire

    Ca sera plus simple non?

    alors disons que j'aimerais changer un fichier texte :

    je vais préciser ma question: comment remplacer une ligne d'un fichier par une autre ?

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 418
    Par défaut
    Avec sed...

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par Newenda Voir le message
    Je suis dans un répertoire avec mes 3 fichiers txt paramètres que je change à la main
    je lance les 3 commandes de programme successives qui vont me sortir tout plein de fichiers dans ce même répertoire
    On peut donc supposer que tes programme génèrent des fichiers dans le répertoire courant (celui dans lequel tu dis "être").

    et j'aimerais TOUT sauver dans un autre
    Ensuite revenir dans l'ancien répertoire, changer mes fichiers paramètres et tout relancer
    ETC.

    Donc j'imagine que le plus pratique c'est de lancer les prog > faire un CP de tout le répertoire vers un autre > Revenir ds le repertoire principal > changer mes fichiers paramètres > Relancer
    Si tu fais une copie des fichiers, ils vont rester présents pour la commande suivante qui, elle-même va copier ses résultats ainsi que ceux de la commande précédente: pas glop!
    Il vaudrait mieux faire un déplacement (commande "mv" et non "cp"), mais le problème c'est de garder les fichiers de paramètres, et autant que possible, ceux-là, il faudrait les copier dans les répertoires résultats (comme ça, on a le jeu de paramètres d'entrée au même endroit que les résultats).
    C'est possible, mais pas hyper facile.

    OU alors

    Créer avant tous les répertoires avec les fichiers paramètres déjà modifés dans chaque et lancer une boucle pour faire tourner les 3 programmes dans chacun des répertoire

    Ca sera plus simple non?
    Oui, ça me paraît plus simple!

    alors disons que j'aimerais changer un fichier texte :

    je vais préciser ma question: comment remplacer une ligne d'un fichier par une autre ?
    Une ébauche (non testé) en repartant de ta proposition (dans un fichier "../../bin/ma_commande.sh"):
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/bin/bash
     
    models="102 103 104"
    for model in $models; do mkdir "$model"; done # une bonne chose de faite...
     
    # Préparation des données
     
    # Pour la 1ère itération, on le garde tel quel
    cp param1.txt 102/
     
    # Pour la 2ème itération, on change tout ce qui doit être changé
    cat param1.txt | sed -e 's|0.005 #dt|0.004 #dt|' > 103/param1.txt
     
    # Pour la 3ème itération, on change tout ce qui doit être changé
    cat param1.txt | sed -e 's|quelque chose|autre chose|' > 104/param1.txt
     
    etc.
     
    # Lancement des itérations
     
    for model in $models; do
        cd "$model" # on change de répertoire courant
        ../../../bin/prog1 # avec un niveau de plus pour remonter en haut...
        ../../../bin/prog2
        mpirun prog3 # on suppose que celui-ci marche...
        cd .. # on revient au répertoire initial
    done

Discussions similaires

  1. [Débutant] Script pour exécuter plusieurs fois un programme
    Par camelia136 dans le forum MATLAB
    Réponses: 4
    Dernier message: 01/08/2011, 11h07
  2. scipt pour exécuter plusieurs fois un programme
    Par djocin dans le forum Linux
    Réponses: 5
    Dernier message: 02/05/2011, 05h13
  3. Réponses: 2
    Dernier message: 12/01/2010, 13h00
  4. Réponses: 0
    Dernier message: 19/01/2009, 11h09

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