Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/11/2006, à 12:23

outworld

[RESOLU] Créer un dossier récursivement

Bonjour,

Je cherche à écrire un script qui me permettrai de créer un dossier dans plusieurs dossiers.
Je m'explique:

j'ai une liste de dossier: dossier1, dossier2, mondossier1, mondossier2, sondossier1, son dossier2.

Je voudrais créer le dossier, par exemple "site".

Mon idée était de lister le nombre de dossier, mettons 6 pour suivre l'exemple.

J'ai donc fait le script:

#!bin/bash

for ((i=0;i<6;i++)); do
     mkdir */site
done

Je place le script au bon endroit, je me place au bon endroit.

J'ai une erreur me disant que le dossier * n'existe pas!

Je ne sais pas comment lui préciser qu'il faut prendre un dossier à la fois et créer le dossier dedans...

Une aide serait la bienvenue.

Merci beaucoup

Dernière modification par outworld (Le 04/11/2006, à 12:47)

Hors ligne

#2 Le 02/11/2006, à 12:57

blutch

Re : [RESOLU] Créer un dossier récursivement

tente plutôt un

for i in `ls`
do
mkdir $i/site &>1 /dev/null
done



plutôt que d'utiliser ls tout simplement, tu peux ajouter l'option -d derrière en principe, mais bizarrement, le ls -d chez moi ne renvoie pas correctement ce qu'il devrait (lister juste les repertoires oO ) et c'est pourquoi j'ai renvoyé les messages d'erreur vers /dev/null derrière la commande mkdir (vu qu'il tentera de faire passer la commande pour un ficher également ce qui ne passera évidement pas... )

sinon, tu peux également passer tes noms de repertoires en arguments, ou encore les citer dans ta commande mais bon, ça c'est plutôt à toi de voir ^^


Si vous m'avez compris, c'est que je me suis mal exprimé :/

Hors ligne

#3 Le 02/11/2006, à 13:04

snapshot

Re : [RESOLU] Créer un dossier récursivement

Salut,

Le fonctionnement de * en shell est un peu déroutant, mais finalement très logique.
En unix et contrairement à windows, les commandes (ici mkdir) ne connaissent rien à la signification de l'étoile (à part quelques rares exceptions, comme find). C'est le shell (bash) qui remplace l'étoile par la liste des fichiers correspondant au motif, et si aucun fichier ne correspond, le programme reçoit étoile en argument. Ainsi, quand tu fais ls *.bak, le shell (bash) va supprimer "*.bak" de la liste des arguments et mettre tous les fichiers correspondant à la place.

Ainsi, quand tu mets "*/site", le shell ne va trouver aucun répertoire contenant un fichier/dossier nommé site. Il va donc passer "*/site" directement à mkdir qui comprendra qu'il faut créer un répertoire site dans le répertoire "*" ...

Pour obtenir ce que tu veux faire (si j'ai bien compris), il faut utiliser une boucle for :

for dir in dossier1 dossier2 mondossier1 mondossier2 sondossier1 sondossier2
do
  mkdir $dir/site
done

Si le répertorie courant ne contient que les dossiers cités, tu peux faire :

for dir in *
do
  mkdir $dir/site
done

car l'étoile sera alors remplacée par la liste des dossiers...


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#4 Le 02/11/2006, à 13:09

luc Milland

Re : [RESOLU] Créer un dossier récursivement

Salut,
je ne comprend pas bien ce que ton script est censé faire.
Tu fais une boucle qui donne successivement à i les valeurs 0,1,2,3,4 et 5, pour exécuter 6 fois la même commande.
Pour l'histoire de "*", c'est mkdir qui ne prend pas l'expansion de *, et c'est bien normal : il ne créé qu'un répertoire à la fois, ou un branche avec l'option -p (mkdir -p blah/bleh/bluh créera bluh et ses dossiers parent si nécessaire).

si tu veux créer une arborescence identique dans tous tes dossier d'un même répertoire :

MY_TREE=site/dossier1/dossier2
MY_SUBTREE=site/pics
for i in * ; do
    if [ -d $i ]; then   # on teste que $i est bien un répertoire
            mdkir -p $i/$MY_TREE
            mdkir  $i/MY_SUBTREE
    fi
done

Voilà, ça répond ?


http://www.praksys.org

Hors ligne

#5 Le 02/11/2006, à 13:12

luc Milland

Re : [RESOLU] Créer un dossier récursivement

oups, snapshot a dégainé plus vite smile

Mais on dit à peu près la même chose, ouf wink


http://www.praksys.org

Hors ligne

#6 Le 02/11/2006, à 13:21

outworld

Re : [RESOLU] Créer un dossier récursivement

Je commencais à me douter du fonctionnement de l'étoile...

Merci beaucoup pour votre aide à tous les deux, j'étais coincé et mes multiples recherches sur google ne m'ont pas aidé.

En tous cas mon problème est résolu merci snapshot pour les explications.

Euh merci à tous les trois je viens de voir ton post luc milland.

Hors ligne

#7 Le 02/11/2006, à 13:33

blutch

Re : [RESOLU] Créer un dossier récursivement

ouaip menfin à coté de snapshot et luc milland, je passe carrément pour un bourrin big_smile
bon j'avoue c'était pas propre, mais fonctionnel tongue


Si vous m'avez compris, c'est que je me suis mal exprimé :/

Hors ligne

#8 Le 02/11/2006, à 13:50

luc Milland

Re : [RESOLU] Créer un dossier récursivement

le ls -d chez moi ne renvoie pas correctement ce qu'il devrait

c'est bien connu le "ls -d" modifie la perception.

Ok, je -> []


http://www.praksys.org

Hors ligne

#9 Le 02/11/2006, à 15:19

Luc Hermitte

Re : [RESOLU] Créer un dossier récursivement

Sous bash (!)

mkdir -p rep/{,ssrep1,ssrep2/{,ssr2ssr1,ssr2ssr2,ssr2ssr3/ss}}

#10 Le 02/11/2006, à 15:24

Luc Hermitte

Re : [RESOLU] Créer un dossier récursivement

Plus dans le cadre de ta question, tu peux grouper avec les accolades un peu partout

mkdir -p {rep1,rep2,rep3}/les/nouveaux/rep{1,2,3}