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.
A voir également:

4 réponses

kilian Messages postés 8854 Statut Modérateur 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
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
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Edit :

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

while [ "$retval" = "0" ]
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
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
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
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
pom
 
merci !
0