[Shell]Tester un chemin grace a 1 contenu

Résolu
Trezeg Messages postés 81 Statut Membre -  
Trezeg Messages postés 81 Statut Membre -
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

7 réponses

  1. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    Salut,

    Ce n'est pas -x qu'il faut utiliser pour tester l'existence d'un rep mais -d
    0
  2. Trezeg Messages postés 81 Statut Membre 2
     
    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
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  4. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    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
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
      1. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Aaah, sympa l'astuce :-)
        0
      2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
    2. Trezeg Messages postés 81 Statut Membre 2
       
      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
    3. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
       
      Teste plutôt
      bash test1
      au lieu de
      sh test1
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
      2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        Pour le C je ne te dit pas :-))
        Demande à "mamiemando" ;-))
        0
  7. kilian Messages postés 8675 Date d'inscription   Statut Modérateur Dernière intervention   1 526
     
    Merci pour vos astuces à tous les deux (mkdir cumulatifs et astuce de lami20j).
    Très instructif!! ;-)
    0
  8. Trezeg Messages postés 81 Statut Membre 2
     
    Ca marche nikel aussi bien avec le bash qu'en tapant ./test1 !
    Merci Kilian ;-)

    Trez
    0