[Shell]Tester un chemin grace a 1 contenu

Résolu/Fermé
Trezeg
Messages postés
73
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
24 novembre 2010
- 17 janv. 2007 à 11:44
Trezeg
Messages postés
73
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
24 novembre 2010
- 18 janv. 2007 à 14:47
Bonjour,

Je cherche a tester l'existence d'un repertoire au bout d'un chemin. Ce chemin est créé par un "cat" sur un fichier de parametres "param" dont le contenu est ceci:
CFI xml 999923 Relances
J'aimerais ensuite tester l'existence d'un repertoire "REP" (que je crée si il n'existe pas).
Pour l'exemple, je voudrais aller au bout du repertoire:
data/CFI/999923/Relances
et tester l'existence de "REP".
Pour le moment j'ai crée ceci en vain:
REP=ACreer
for i in `cat $param`
    do
 	if [ ! -x $data/$1/$3/$4/${REP} ] ; then
           mkdir ${REP}
        fi
    done
Merci de votre aide

7 réponses

kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
17 janv. 2007 à 16:56
Salut,

Ce n'est pas -x qu'il faut utiliser pour tester l'existence d'un rep mais -d
0
Trezeg
Messages postés
73
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
24 novembre 2010
2
17 janv. 2007 à 17:13
Hello Kilian,

Je m'étais rendu compte de ma betise mais je ne pouvais plus éditer le post... Cela dit, meme avec le -d le probleme demeure le meme...

Trez
0
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
17 janv. 2007 à 18:35
Salut,

Essaie plutôt :
while read line
do set ${line}
if [ ! -d  "/data/$1/$3/$4" ]
then
echo -e "Création du répertoire $4"
mkdir -p /data/$1/$3/$4
fi
done < $(eval echo $param)
;-))
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
17 janv. 2007 à 19:07
Pour accompagner jipicy, voici un autre exemple ou l'on prend les paramètres depuis un fichier.

Imagine, tu as un fichier dans le rep courant appelé CFI qui contient:
CFI xml 999923 Relances
CFI xml 999923 Relances2
CFI xml 999923 Relances3


Tu veux tester si data/colonne 1/colonne 3/colonne 4 existe.
Par exemple data/CFI/999923/Relances pour la première occurence.
S'ils n'existe pas, on les crée.
On pars du principe que data/CFI/999923/ existe déjà.

Ca nous donne
param=CFI #le fichier
#le sed permet de remplacer les espaces par des points-virgule
#sinon, les espaces sont pris comme séparateur comme les lignes
#dans une boucle for
for i in `cat $param | sed "s/ /;/g"`
do
       #On cherche le nom du rep (avec colonne 1, colonne 3 etc....)
       #le point virgule est pris comme délimiteur de champs pour cut
        rep=data/$(echo $i | cut -d\; -f 1)/$(echo $i | cut -d\; -f 3)/$(echo $i | cut -d\; -f 4)
       #S'il n'existe pas: création du repertoire
        if [ ! -d $rep ] 
        then
                mkdir $rep
        fi
done


Note que pour créer un repertoire comme
a/b/c/d/e
Il faut déjà avoir créé a/b/c/d
0
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
17 janv. 2007 à 19:14
Salut kilian,

Joli exposé ;-))

Note que pour créer un repertoire comme
a/b/c/d/e
Il faut déjà avoir créé a/b/c/d

Ou utiliser le paramètre "-p" de la commande "mkdir" :
[jp@MDK tmpfs]$ ls
fich.txt

[jp@MDK tmpfs]$ mkdir -p a/b/c/d/e

[jp@MDK tmpfs]$ ls
a/  fich.txt

[jp@MDK tmpfs]$ ls -R

.:
a/  fich.txt

./a:
b/

./a/b:
c/

./a/b/c:
d/

./a/b/c/d:
e/

./a/b/c/d/e:

[jp@MDK tmpfs]$
;-))
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523 > jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

17 janv. 2007 à 21:21
Aaah, sympa l'astuce :-)
0
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897 > jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

17 janv. 2007 à 21:38
Note aussi qu'on peut "cumuler"...
mkdir -p data/rep3/{repA/{rep1,rep2,rep3},repB/{mon_rep1,mon_rep2},repC,repD}
;-))Ce qui donne :;-))
0
Trezeg
Messages postés
73
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
24 novembre 2010
2
18 janv. 2007 à 10:50
Hello,

J'ai testé la soluce de Kilian mais j'obtiens un message d'erreur.
Je récapitule mon cheminement:
$ pwd
/opt/app/progres/interfaces/bin/sql4out
$

$ ls -l
total 12
drwxr-xr-x   3 oper    oper         512 Jan 18 09:57 CFI
-rw-r--r--   1 oper    oper          29 Jan 18 10:04 par4out.par
-rwxr-xr-x   1 oper    oper         752 Jan 18 10:26 test1
      
$ cat par4out.par
OCPA-CFI xml 999923 Relances

$ more test1
WRK_DIR=PourTransmettre
SQL4OUT_DIR=/opt/app/progres/interfaces/bin/sql4out
DATA_DIR=/opt/app/progres/interfaces/bin/sql4out
cd $DATA_DIR
#le sed permet de remplacer les espaces par des points-virgule
#sinon, les espaces sont pris comme séparateur comme les lignes
#dans une boucle for
for i in `cat ${SQL4OUT_DIR}/par4out.par | sed "s/ /;/g"`
do
       #On cherche le nom du rep (avec colonne 1, colonne 3 etc....)
       #le point virgule est pris comme delimiteur de champs pour cut
       rep=$(echo $i | cut -d\; -f 1)/$(echo $i | cut -d\; -f 3)/$(echo $i | cut -d\; -f 4)
       #S'il n'existe pas: creation du repertoire
        if [ ! -d $rep/$WRK_DIR ]
        then
                mkdir -p $rep/$WRK_DIR
        fi
done 

$ sh test1   
test1: syntax error at line 13: `rep=$' unexpected

Je n'arrive pas à débugger le truc malgré quelques modifs :((

Trez
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
18 janv. 2007 à 14:30
Teste plutôt
bash test1
au lieu de
sh test1
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 566
17 janv. 2007 à 21:55
Salut,

et de ça, qu'en pensez-vous?

J'ai utilisé l'exemple de kilian, comme d'hab, je suis paresseux :-)
CFI xml 999923 Relances
CFI xml 999923 Relances2
CFI xml 999923 Relances3

Au début /home/lami20j/CFI n'existe pas
lami20j@debian:~$ ls -R CFI/
ls: CFI/: No such file or directory
je crée les répertoires en utilisant les données du fichier

$ for i in $(sed 's/ /\//g' param);do if [ ! -d $(dirname $HOME/$i)/$(basename $HOME/$i) ];then mkdir -p $HOME/$i;fi;done


j'affiche le résultat
$ ls -R CFI/
CFI/:
xml

CFI/xml:
999923

CFI/xml/999923:
Relances  Relances2  Relances3

CFI/xml/999923/Relances:

CFI/xml/999923/Relances2:

CFI/xml/999923/Relances3:

je crée le fichier a dans /home/lami20j/CFI/xml/999923/Relances
et le ficher bb dans /home/lami20j/CFI/xml/999923/Relances2
je supprime le répertoire /home/lami20j/CFI/xml/999923/Relances3
$ touch CFI/xml/999923/Relances/a
$ touch CFI/xml/999923/Relances2/bb
$ rmdir CFI/xml/999923/Relances3
j'affiche
$ ls -R CFI/
CFI/:
xml

CFI/xml:
999923

CFI/xml/999923:
Relances  Relances2

CFI/xml/999923/Relances:
a

CFI/xml/999923/Relances2:
bb
je relance la commande qui lit le fichier paramètre

$ for i in $(sed 's/ /\//g' param);do if [ ! -d $(dirname $HOME/$i)/$(basename $HOME/$i) ];then mkdir -p $HOME/$i;fi;done


j'affiche
$ ls -R CFI/
CFI/:
xml

CFI/xml:
999923

CFI/xml/999923:
Relances  Relances2  Relances3

CFI/xml/999923/Relances:
a

CFI/xml/999923/Relances2:
bb

CFI/xml/999923/Relances3:


0
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
17 janv. 2007 à 22:05
Salut,

et de ça, qu'en pensez-vous ?
Que tu devrais laisser tomber "PERL" ;-DDDDD

Sinon, c'est nickel (mais je préfère quand même mon mien de moi ;-)) )
0
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 566 > jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

17 janv. 2007 à 22:16
Re,

mais je préfère quand même mon mien de moi

c'est normal :-)

toutefois j'ai pensé à
Le savoir n'est bon que s'il est partagé.
;-)

En ce qui concerne Perl, je ne laisse pas tomber(c'est mon préféré :-)) mais sache que j'ai commencé aussi le C, très sérieusement, et je me suis penché un peu sur sed et bash :-) (ici c'est ta fote :-))

Pour le C je ne te dit pas :-))
0
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897 > lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019

17 janv. 2007 à 22:26
Pour le C je ne te dit pas :-))
Demande à "mamiemando" ;-))
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
17 janv. 2007 à 23:47
Merci pour vos astuces à tous les deux (mkdir cumulatifs et astuce de lami20j).
Très instructif!! ;-)
0
Trezeg
Messages postés
73
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
24 novembre 2010
2
18 janv. 2007 à 14:47
Ca marche nikel aussi bien avec le bash qu'en tapant ./test1 !
Merci Kilian ;-)

Trez
0