Les Allergies
Alimentaires
Posez votre question Signaler

[Shell]Tester un chemin grace a 1 contenu [Résolu]

Trezeg 79Messages postés 20 décembre 2006Date d'inscription 3 octobre 2010Dernière intervention - Dernière réponse le 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
Lire la suite 

[Shell]Tester un chemin grace a 1 contenu »

15 réponses
Réponse
+0
moins plus
Salut,

Ce n'est pas -x qu'il faut utiliser pour tester l'existence d'un rep mais -d
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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)
;-))
Ajouter un commentaire
Réponse
+0
moins plus
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
jipicyjipicy - 17 janv. 2007 à 21:38
Note aussi qu'on peut "cumuler"...;-))
Trezeg- 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
kilian- 18 janv. 2007 à 14:30
Teste plutôt
bash test1
au lieu de
sh test1
Ajouter un commentaire
Réponse
+0
moins plus
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:


jipicy- 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 ;-)) )
lami20j- 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 :-))
jipicy- 17 janv. 2007 à 22:26
Pour le C je ne te dit pas :-))
Demande à "mamiemando" ;-))
Ajouter un commentaire
Réponse
+0
moins plus
Merci pour vos astuces à tous les deux (mkdir cumulatifs et astuce de lami20j).
Très instructif!! ;-)
Ajouter un commentaire
Réponse
+0
moins plus
Ca marche nikel aussi bien avec le bash qu'en tapant ./test1 !
Merci Kilian ;-)

Trez
Ajouter un commentaire
Ce document intitulé « [Shell]Tester un chemin grace a 1 contenu » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?