Programmation sous shell
pom
-
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.
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
-
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) -
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 exitTu devrais pas avoir de mal à l'adapter en shell "csh". -
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)}";
-
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)}
-
-