Programmation sous shell

pom -  
 pom -
Bonjour, je dois faire plein de simulations avec mon prgm (écrit en C). Ce prgm écrit sur le disque dur (sous forme de fichier txt) N fichiers où N est une donnée initiale de mon programme. J'aimerai donc me faire un script qui fait plusieurs choses
1) qui lance mon prgm C (j'ai fait un Makefile)
2) Si le répertoire Output n'existe pas le créer
3) Si le répertoire Output existe, regarder si le répertoire Output/Output1 existe. S'il existe passer au répertoire Output/Output2 et ainsi de suite jusqu'à quand il y en ai un qui n'existe pas
4) Une fois que le répertoire Output/Output5 (par exemple) n'existe pas, le créer et déplacer tous les fichiers Particule*.txt dans ce répertoire Output/Output5.

Voilà j'espère que mon problème est compréhensible.

D'où ma question : comment écrire un tel script ? Dans quel langage ?
Merci.
Configuration: Suse Pro 9.1

4 réponses

  1. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    D'où ma question : comment écrire un tel script ? Dans quel langage ?

    Beaucoup de langage de script pourraient faire l'affaire.
    Là tu as vraiment un large choix: script bash, perl, python (sans compter tous les autres shells qui existent). Question de goût.

    Tiens un petit exemple en python:
    import os # Module qui contient des fonctions pour fichiers/repertoires
    
    #Fonction qui copie les fichiers du repertoire courant dans le repertoire rep
    #Il y aura une erreur s'il ya d'autres repertoires dans le repertoire courant
    def copy_files(rep):
           # Pour tous les noms de fichiers dans le repertoire courant
           for element in os.listdir('.'): 
                   #Mettre ce fichier dans la variable source
                   source=open(element).read()
                   #On le copie dans le repertoire destination
                   destination=open(rep + '/' + element,'w')
                   destination.write(source)
                   destination.close()
    
    N=5 #(par exemple)
    #Equivalent en c: for(nb=0;nb<=N;nb++)
    for nb in range(0,N+1):
            rep='./Output' + str(nb)
            # Ouput + nb n'existe pas, on crée le repertoire
            if not os.path.isdir(rep):
                   #On crée le dossier et copie les fichiers
                   os.mkdir(rep)
                   copy_files(rep)
    0
    1. pom
       
      Salut kilian, merci !
      on m'a conseillé le csh. Je vais donc m'inspirer de ce que tu as fait pour le retranscrie en csh.
      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Tiens la même chose en bash :
    #! /bin/bash
    
    # Création des variables
    rep=Output  # Répertoire racine
    i=1         # Initialisation compteur
    retval=0    # Code retour
    
    # Tant que le code retour est égal à zéro on boucle
    while [ \"$retval\" = \"0\" ]
    do
            # Si le répertoire racine existe
            if [ -d $rep ]
            then
                    # Alors on regarde si le sous-répertoire
                    # du même nom plus la valeur du compteur ($i)
                    # existe aussi
                    if [ -d $rep/$rep$i ]
                    then
                            # Si c'est la cas alors on incrémente le compteur
                            i=$(expr $i + 1)
                            # Le code retour est toujours égal à zéro
                            retval=0
                    # Sinon
                    else
                            # On le crée
                            mkdir $rep/$rep$i
                            # Et on y copie les fichiers
                            cp Particule* $rep/$rep$i/
                            # On passe le code retour à un ce qui a pour effet
                            # d'arrêter la boucle
                            retval=1
    
                    fi
            # Sinon si le répertoire racine n'existe pas
            else
                    # On crée le répertoire racine
                    mkdir $rep
                    # Et on y copie les fichiers
                    cp Particule* $rep
                    exit
    
            fi
    done
    exit
    
    Tu devrais pas avoir de mal à l'adapter en shell "csh".
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Edit :

      La ligne "while [ \"$retval\" = \"0\" ]"
      doit s'écrire sans les anti-slashes comme suit :

      while [ "$retval" = "0" ]
      0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut à tous,

    et en Perl

    #! /usr/bin/perl

    use warnings;
    use strict;

    my $i = 0;

    # dans le répertoire courant on crée OUTPUT s'il n'existe pas
    mkdir "./OUTPUT" unless (opendir REP, "./OUTPUT");

    # pour chaque fichier de répertoire OUTPUT
    while (my $rep = readdir(REP)) {
    $i +=1 if $rep =~ /output/i; # si OUTPUT on compte
    mkdir "./OUTPUT/OUTPUT${ ($i+1) }"; # et on cree OUTPUT+1
    }
    # on copie dans OUTPUT +1 ( le dernier OUTPUT )
    system "cp ./PARTICULE*.txt ./OUTPUT/OUTPUT${($i+1)}";
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

      Correction pour le script (msg N° 4)

      #! /usr/bin/perl

      use warnings;
      use strict;

      my $i = 0;

      opendir REP, "./OUTPUT" or # ouvrir un handle vers rép OUTPUT
      mkdir "./OUTPUT" and # ou créer rép OUTPUT
      opendir REP, "./OUTPUT"; # et ouvrir un handle vers rép OUTPUT

      while (my $rep = readdir(REP)) { # chaque fichier dans OUTPUT
      $i+=1 if $rep =~ /output/i; # si OUTPUT on compte
      mkdir "./OUTPUT/OUTPUT${($i+1)}"; # et on cree OUTPUT+1
      }
      # on copie dans OUTPUT +1 ( le dernier OUTPUT )
      system "cp ./PARTICULE*.txt ./OUTPUT/OUTPUT${($i+1)}";

      # les fichiers PARTICULES*.txt sont copies
      # dans le dernier rep OUTPUT crée

      P.S je vois qu'il y a des problèmes avec les antislashes

      ${($i+1)}

      en fait c'est

      ${antislash($i + 1)}
      0