bonjour,
J'ai fait un script mais il ne veut pas accepter les deux conditions pour une boucle For.
voici mon code:
est-ce exacte cette For?Code:
1
2
3
4
5 for f1 in *.tfa.txt && f2 in *.txt do java Teiresias $f1 $f2 done
Merci
Version imprimable
bonjour,
J'ai fait un script mais il ne veut pas accepter les deux conditions pour une boucle For.
voici mon code:
est-ce exacte cette For?Code:
1
2
3
4
5 for f1 in *.tfa.txt && f2 in *.txt do java Teiresias $f1 $f2 done
Merci
Bonjour,
Non, for sous cette syntaxe, ne peux prendre qu'un seul paramètre de liste.
Si tu es sous bash, le plus simple est de passer par 2 tableaux f1 et f2 ainsi tu les parcourir en même temps via le même indice.
désolé je ne suis pas expert en script shell.
Comment faire ça s'il te plait? sinon avec le "While" est-ce que c'est possible?
Merci
Il y a plusieurs façons de comprendre ce qui est attendu. En voici une:
Si pas ça, il faudrait nous expliquer avec un exemple concret les paramètres qui doivent être passé à la commande "java Teiresias".Code:
1
2
3
4
5 for f1 in *.tfa.txt; do for f2 in *.txt; do java Teiresias $f1 $f2 do done
non le code à double For imbriqué est pas possible.
je veux qu'il prend en même temps les deux fichiers(de deux différents dossiers).
c'est à dire:
java Teiresias 1.tfa.txt 1.txt
java Teiresias 2.tfa.txt 2.txt
java Teiresias 3.tfa.txt 3.txt
java Teiresias 4.tfa.txt 4.txt
java Teiresias 5.tfa.txt 5.txt
....
est-ce que vous pouvez m'aider? Je ne suis pas expert en shell mais je suis obligé de passer par shell.
MErci
Bonjour,
apparmement, à tout fichier .tfa.txt correspond un fichier .txt, et réciproquement. ;)
il faut simplement "découper" le nom de fichier pour ne garder que la "racine", et lui adjoindre l'extension du fichier complémentaire.
Code:
1
2
3
4 for f in ./*.txt do echo "${f%.*}.tfa.txt && $f" done
non non!
c'est juste un exemple pour monter que se sont deux différents fichiers et deux différents dossiers (chemin).
ava Teiresias BBA001.tfa.txt 1.txt
java Teiresias BBA002.tfa.txt 2.txt
java Teiresias BBA003.tfa.txt 3.txt
java Teiresias BBA004.tfa.txt 4.txt
java Teiresias BBA005.tfa.txt 5.txt
est-ce qu'il y a une solution pour cette exemple?
Merci
Un exemple:
Le $ en début de ligne est mon prompt.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 $ ls -R .: rep1 rep2 ./rep1: fich1.tfa.txt fich2.tfa.txt fich3.tfa.txt fich4.tfa.txt fich5.tfa.txt ./rep2: fich1.txt fich2.txt fich3.txt fich4.txt fich5.txt $ f1=(rep1/*) $ f2=(rep2/*) $ i=-1 ; while ((i++ < ${#f1[@]}-1)) do echo ${f1[$i]} ${f2[$i]} done rep1/fich1.tfa.txt rep2/fich1.txt rep1/fich2.tfa.txt rep2/fich2.txt rep1/fich3.tfa.txt rep2/fich3.txt rep1/fich4.tfa.txt rep2/fich4.txt rep1/fich5.tfa.txt rep2/fich5.txt
est-ce que tu peux m'expliquer un peut le code?
en plus pour plusieurs manipulations.(différents fichiers de différents dossiers) est-ce que je dois à chaque fois créer un tableau dans le script shell???
MErci
j'ai ma petite idée.
mais il y a un problème dans f2=$i.txt; je veux f2 soit f2=1.txt puis 2.txt puis 3.txt .....Code:
1
2
3
4
5
6
7
8
9 #!/bin/bash javac Teiresias.java $ i=1; for f1 in *.tfa.txt do f2=$i.txt; java Teiresias $f1 $f2 i=i+1; done
avec i s'incrémente automatique.
est-ce que vous pouvez m'aider?
MErci
salut,
:roll:
j'ai une question idiote, si on a pas le même nombre de fichiers dans les deux répertoires, ou qu'il y a un décalage (dans le premier répertoire les fichiers vont de 1 à 5 par exemple et dans le deuxième ils vont de 2 à 6, on se retrouve avec java toto "machin1.tfa.txt" "machin2.txt" ou java toto "machin5.tfa.txt" "" etc.) il se passe quoi ? on s'en fout le programme java se débrouille ? ou alors le script doit gérer ce cas particulier ? ou encore ça ne peut jamais arriver parcequ'on sait qu'on a toujours les fichiers de 1 à 9 très exactement ? etc.
Je ne vois pas trop ce qu'il faut expliquer ici, c'est les bases du shell, peut-être juste ${#f1[@]} qui le nombre d'éléments du tableau f1.
(En shell comme dans la plupart des langages, l'indice du premier élément est zéro).
Ensuite, quelques soient le nombre de fichiers que tu as et leur localité, tu n'auras besoin que de ces 2 tableaux, il faut juste les remplir en conséquence (de la même façon que si tu avais pu utiliser ton formalisme de boucle for).
les fichiers dans les deux dossiers sont ordonnés.
Qu'est-ce que tu ne comprends pas dans ce code?
Comme dirait Jiliagre:Citation:
en plus pour plusieurs manipulations.(différents fichiers de différents dossiers) est-ce que je dois à chaque fois créer un tableau dans le script shell???
Pourrais-tu être plus précis sur ce que tu veux?
Peux-tu décrire précisément quels sont ces "différents fichiers de différents dossiers", ce qu'ils ont en commun, ce qu'ils ont de différent, comment les utiliser?
Sinon, pour combiner ta toute première proposition for f1 in *.tfa.txt && f2 in *.txt avec la solution proposée par Disdorgue, on pourrait "énumérer en parallèle" les fichiers *.tfa.txt et les autres fichiers *.txt du même répertoire avec:
Est-ce que cela répondrait à ta question?Code:
1
2
3
4
5
6 lf_tfa=(*.tfa.txt) lf_txt=($(echo *.txt | tr ' ' '\n' | fgrep -v '.tfa.txt')) i=-1 while ((i++ < ${#lf_tfa[@]}-1)) do echo ${lf_tfa[$i]} ${lf_txt[$i]} done
basename est fort utile dans ce genre de cas, notamment son argument optionnel qui spécifie une extension à virer, à croire que ça a été fait pour :mouarf:
je propose :
l'arborescence de test est la suivante :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 #!/bin/bash REP1=rep1 REP2=rep2 for fic1 in ${REP1}/*.tfa.txt; do fic2="${REP2}"/$(basename "${fic1}" .tfa.txt)".txt" if [ -e "${fic2}" ]; then echo "java machin \"${fic1}\" \"${fic2}\"" else echo "probleme, FIC1=\"${fic1}\", FIC2 ne semble pas exister, FIC2=\"${fic2}\"" fi done
et le résultat :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 . | script.sh | +---rep1 | bouzin.tfa.txt | coincoin.tfa.txt | fichier avec espace.tfa.txt | gruik.extension.foireuse | prout.tfa.txt | toto.tfa.txt | \---rep2 bouzin.txt coincoin.txt fichier avec espace.txt pouet.txt toto.txt
Code:
1
2
3
4
5
6 $ ./script.sh java machin "rep1/bouzin.tfa.txt" "rep2/bouzin.txt" java machin "rep1/coincoin.tfa.txt" "rep2/coincoin.txt" java machin "rep1/fichier avec espace.tfa.txt" "rep2/fichier avec espace.txt" probleme, FIC1="rep1/prout.tfa.txt", FIC2 ne semble pas exister, FIC2="rep2/prout.txt" java machin "rep1/toto.tfa.txt" "rep2/toto.txt"
Bonjour :coucou:
Citation:
non le code à double For imbriqué est pas possible.
je veux qu'il prend en même temps les deux fichiers(de deux différents dossiers).
Donc si on se résume, tu veux deux fichiers de noms quelconques, mais qui sont dans le même ordre dans le dossier. :roll:Citation:
non non!
c'est juste un exemple pour monter que se sont deux différents fichiers et deux différents dossiers (chemin).
Pardon mais ça sent la mauvaise bidouille.
bash n'a pas besoin de basename, comme je l'ai montré.
ma solution a été recalée car les noms des fichiers dans les deux répertoires ne sont pas les mêmes. :weird:
+1 Flodelarab
ce qui, en concis, donne :Code:
1
2
3
4 for f in *.tfa.txt do java Teiresias "$f" $((++i)).txt done