Rechercher : dans
Par :

[Shell]Tester un chemin grace a 1 contenu

Dernière réponse le 18 jan 2007 à 14:47:27 Trezeg, le 17 jan 2007 à 11:44:34 
 Signaler ce message aux modérateurs

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
Configuration: SunOS 5.9

Meilleures réponses pour « [Shell]Tester un chemin grace a 1 contenu » dans :
[Shell] Tester une variable numérique Voir Tester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Guide d'utilisation du Shell pour débutant VoirSHELL BASH - GUIDE D'UTILISATION - Niveau Débutant Introduction Appel aux membres CCM II. C'est quoi le shell ? III. Comment accéder à la ligne de commande IV. Les consoles virtuelles Exemple : Accéder à la console 3 depuis l'interface...
[PHP] Lister le contenu d'un répertoire VoirGrâce à PHP, il est possible d'afficher le contenu d'un répertoire et de ses sous-répertoires. Voici ci-dessous une fonction permettant de parcourir récursivement les répertoires et sous-répertoires et d'en afficher les fichiers : function...
[Shell] Accès aux dernières commandes de l'historique VoirLe shell Linux/Unix regorge de fonctionnalités permettant de gagner du temps. Ainsi, il est possible de remonter dans l'historique des dernières commandes grâce aux flèches de navigation en appuyant sur la flèche du haut. Mais il y a moyen...
PHP - Récupération de données VoirPHP rend très simple la récupération de données envoyées par l'intermédiaire de formulaires HTML. Création d'un formulaire Grâce à la balise FORM du langage HTML, il est très simple de créer des formulaires comprenant : des champs de saisie des...
Tests et diagnostics du réseau VoirTester la configuration IP Avant toute chose, il est recommandé de véfier la configuration IP de l'ordinateur. Les systèmes Windows proposent un outil en ligne de commande, appelé ipconfig permettant de connaître la configuration IP de...
Commandes UNIX VoirTableau des principales commandes UNIX Commande Unix Description Options ls liste le contenu d'un répertoire -a Affiche tous les fichiers, y compris les fichiers cachés ...

1

kilian, le 17 jan 2007 à 16:56:33

Salut,

Ce n'est pas -x qu'il faut utiliser pour tester l'existence d'un rep mais -d

..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...

Répondre à kilian

2

Trezeg, le 17 jan 2007 à 17:13:12

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

Répondre à Trezeg

3

jipicy, le 17 jan 2007 à 18:35: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)
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

4

kilian, le 17 jan 2007 à 19:07:28

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
..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...

Répondre à kilian

5

jipicy, le 17 jan 2007 à 19:14:48

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]$
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

6

kilian, le 17 jan 2007 à 21:21:02

Aaah, sympa l'astuce :-)

..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...

Répondre à kilian

7

jipicy, le 17 jan 2007 à 21:38:08

Note aussi qu'on peut "cumuler"...

mkdir -p data/rep3/{repA/{rep1,rep2,rep3},repB/{mon_rep1,mon_rep2},repC,repD}
;-))Ce qui donne :
ls -R
.:
data/  

./data:
rep3/

./data/rep3:
repA/  repB/  repC/  repD/

./data/rep3/repA:
rep1/  rep2/  rep3/

./data/rep3/repA/rep1:

./data/rep3/repA/rep2:

./data/rep3/repA/rep3:

./data/rep3/repB:
mon_rep1/  mon_rep2/

./data/rep3/repB/mon_rep1:

./data/rep3/repB/mon_rep2:

./data/rep3/repC:

./data/rep3/repD:
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

13

Trezeg, le 18 jan 2007 à 10:50: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

Répondre à Trezeg

14

kilian, le 18 jan 2007 à 14:30:34

Teste plutôt
bash test1
au lieu de
sh test1

..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...

Répondre à kilian

8

lami20j, le 17 jan 2007 à 21:55:31

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:


lami20j

Répondre à lami20j

9

jipicy, le 17 jan 2007 à 22:05:35

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 ;-)) )
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

10

lami20j, le 17 jan 2007 à 22:16:32

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 :-))
lami20j

Répondre à lami20j

11

jipicy, le 17 jan 2007 à 22:26:35

Pour le C je ne te dit pas :-))
Demande à "mamiemando" ;-))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

12

kilian, le 17 jan 2007 à 23:47:05

Merci pour vos astuces à tous les deux (mkdir cumulatifs et astuce de lami20j).
Très instructif!! ;-)

..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...

Répondre à kilian

15

 Trezeg, le 18 jan 2007 à 14:47:27

Ca marche nikel aussi bien avec le bash qu'en tapant ./test1 !
Merci Kilian ;-)

Trez

Répondre à Trezeg