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.
A voir également:
- Programmation sous shell
- Classic shell - Télécharger - Personnalisation
- Application de programmation - Guide
- Comment mettre en veille un programme sous windows 10 - Guide
- Secure shell - Télécharger - Divers Web & Internet
- Shell infrastructure host c'est quoi - Guide
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:
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 :
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".
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)}";
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)}
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)}
on m'a conseillé le csh. Je vais donc m'inspirer de ce que tu as fait pour le retranscrie en csh.