Création automatique de sous-dossiers

Création automatique de sous-dossiers - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 22-11-2012 à 16:02:06    

Bonjour,
 
Je souhaite créer automatiquement des sous-dossiers lors de la création d'un dossier.
Par exemple:
Un utilisateur crée un dossier "Commercial" sur un lecteur réseau. Lors de la création de ce dossier, 3 sous-dossiers doivent être crées.
Un dossier "contrat", "démarches commerciales" et "prospection".
 
Mon problème est que je ne vois pas comment réaliser cela.
La deuxième solution, peut être plus simple, est de planifier une tâche qui va passer en revue les dossier nouvellement crées dans la journée et d'y créer les nouveaux sous-dossiers.
 
Merci d'avance pour votre aide.

Reply

Marsh Posté le 22-11-2012 à 16:02:06   

Reply

Marsh Posté le 22-11-2012 à 16:27:03    

man mkdir => mkdir -p


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 22-11-2012 à 17:01:35    

:heink:  
Merci mais je connais la commande mkdir avec -p.
Ce que j'aimerai savoir c'est comment tu fais pour une liste de dossiers?

Message cité 1 fois
Message édité par Mc Kagan le 22-11-2012 à 17:01:47
Reply

Marsh Posté le 22-11-2012 à 17:14:53    

Mc Kagan a écrit :

:heink:  
Merci mais je connais la commande mkdir avec -p.
Ce que j'aimerai savoir c'est comment tu fais pour une liste de dossiers?


{a,b,c}


---------------
Décentralisons Internet-Bépo-Troll Bingo - "Pour adoucir le mélange, pressez trois quartiers d’orange !"
Reply

Marsh Posté le 22-11-2012 à 17:20:50    

Vous étés facturé au nombre de caractère saisi sur le clavier ou quoi?
Est ce que tu pourrais développer?


Message édité par Mc Kagan le 22-11-2012 à 17:21:06
Reply

Marsh Posté le 22-11-2012 à 20:57:16    

salut,
 

Code :
  1. $ echo a/{b,c,d}
  2. a/b a/c a/d

c'est plus clair comme ça ?

Reply

Marsh Posté le 22-11-2012 à 23:09:08    

iUn poil plus explicite que les autres forumeurs/modos dont on aura la peau car ils sont fascho

mkdir -p a/{contrat,"démarches commerciales","prospection"}


[:opus dei]

[ oggy@monsen ~/Documents ]
> tree a                                                    
a
├── contrat
├── démarches commerciales
└── prospection


\oi/

Message cité 1 fois
Message édité par o'gure le 22-11-2012 à 23:21:04
Reply

Marsh Posté le 23-11-2012 à 01:04:47    

Mc Kagan a écrit :

Bonjour,
 
Je souhaite créer automatiquement des sous-dossiers lors de la création d'un dossier.
Par exemple:
Un utilisateur crée un dossier "Commercial" sur un lecteur réseau. Lors de la création de ce dossier, 3 sous-dossiers doivent être crées.
Un dossier "contrat", "démarches commerciales" et "prospection".
 
Mon problème est que je ne vois pas comment réaliser cela.
La deuxième solution, peut être plus simple, est de planifier une tâche qui va passer en revue les dossier nouvellement crées dans la journée et d'y créer les nouveaux sous-dossiers.
 
Merci d'avance pour votre aide.


 
Si on me demandait de faire ça:
1. je dirai que ça doit pas être fait sur le serveur de fichiers (qui fournit un système de fichiers standard et rien d'autre)
2. je bricolerai un truc avec inotify pour déclencher une commande à la détection de la création d'un dossier

Reply

Marsh Posté le 23-11-2012 à 10:08:37    

o'gure a écrit :

iUn poil plus explicite que les autres forumeurs/modos dont on aura la peau car ils sont fascho


 
Merci!

Reply

Marsh Posté le 23-11-2012 à 11:38:16    

[:predicator] pour BlockDevice pour inotify, même si ce dernier travaille dans les évènements sur les créations de fichiers et dossiers. Pour peu que l'on souhaite surveiller que la création de dossier ça risque d'être délicat non ? donc ajouter du test pour savoir si c'est bien un dossier qui a été créé.
De plus cela oblige soit d'avoir un moniteur sur le serveur, avec un envoi par mail régulier, ou d'avoir le moniteur sur sa machine avec un accès complet aux partages depuis sa machine (root ou utilisateurs avec les droits nécessaires).
Vu que le 2ème cas peut s'avérer problématique, autant rester sur le serveur.
 
Je partirais donc sur un script bash à partir d'inotify, mais directement sur le serveur :

#!/bin/bash
 
inotifywait -qme create --format '%w%f' /partage | while read f; do
 
if [ -d $f ];
then
    mydir=`basename $f`;
    echo "$mydir is a new directory";
    mkdir -p $f/{contrat,"démarches commerciales","prospection"}
fi
done
 
exit 0


Pas testé, pas débuggé, vaguement copié d'ici, crade [:yiipaa:4]  
A voir aussi ça pour un truc plus propre, et aussi ça pour une meilleure gestion des processus.


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 23-11-2012 à 11:38:16   

Reply

Marsh Posté le 23-11-2012 à 12:15:05    

C'est très probablement efficace, mais ça me parait assez lourd à mettre en place. Je vais me concentrer sur les scripts pour le moment

Reply

Marsh Posté le 23-11-2012 à 13:05:37    

Non mais... c'est du script bash :D
Si tu veux le faire avec les outils de base, tu vas avoir du mal...


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 23-11-2012 à 14:38:17    

Bon....

Reply

Marsh Posté le 27-11-2012 à 17:05:08    

Ton script Bardiel, il démonte tout! C'est ce qu'il me fallait ;)

 

Par contre ça fonctionne pas à partir du partage. Par exemple lorsque j'accède à un partage depuis Windows et que je crée un dossier, ça ne fonctionne pas.


Message édité par Mc Kagan le 27-11-2012 à 17:15:34
Reply

Marsh Posté le 28-11-2012 à 15:48:28    

Sauf que le script là, il s'arrête au 1er dossier crée. Donc si par la suite tu en crée d'autres le script ne s'exécute plus :/
Donc avec une petite boucle infinie (à tuer par un kill) ça donnerait :

#!/bin/bash  
while :
do
inotifywait -qme create --format '%w%f' /partage | while read f; do  
 
if [ -d $f ];  
then  
    mydir=`basename $f`;  
    mkdir -p $f/{contrat,"démarches commerciales","prospection"}  
fi  
done  
done


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 28-11-2012 à 15:50:26    

Il me semble que j'avais essayé avec plusieurs dossiers et ça fonctionnait à chaque fois. Je vais ressayer pour confirmer.

Reply

Marsh Posté le 03-01-2013 à 12:35:09    

Je me permets de relancer le sujet. Pour des raisons de simplicité, je compte mettre en place une tâche planifiée qui va créer ces sous-dossiers, si ils n’existent pas à une heure précise.
Mon problème est de savoir comment "scanner" les dossiers présents pour y ajouter les sous-dossiers si ils n’existent pas.

 

J'ai avancé un peu. En gros je liste les dossiers qui contiennent les sous-dossiers en question avec la commande suivante

Code :
  1. find / -name "DocsTLS" -type d


Maintenant comment faire l'inverse? Liste les dossiers qui ne contiennt pas ce sous-dossier pour du coup le créer?

 

Merci


Message édité par Mc Kagan le 03-01-2013 à 15:42:48
Reply

Marsh Posté le 03-01-2013 à 23:03:13    

#!/bin/bash
if [ -d /path/to/dir ]; then
 # le répertoire existe
else
 # le répertoire n'existe pas
fi


Google, 3ème réponse, 5 secondes [:the geddons]  
 
En gros tu inclus dans ta boucle de création de dossiers un test pour savoir si le dossier (directory, donc -d ) existe ou non. Par rapport à toi c'est l'inverse que l'on veut (l'absence des dossiers) donc :

#!/bin/bash
if [ ! -d /path/to/dir ]; then
 # le répertoire n'existe pas
else
 # le répertoire existe
fi


En méthode pas trop brutos (toujours crade/non testé/non optimisé), ça donnerait :

#!/bin/bash
while read line
do
f=$line/prospection
if [ ! -d $f ]; then  
 # le répertoire n'existe pas  
 mkdir -p $f/{contrat,"démarches commerciales","prospection"}
fi
done < <(find /partage/ -type d  -maxdepth 1 -print)


A noter que là je ne fais le test que sur le sous-dossier "prospection", il faudrait le faire pour chaque sous-dossier à créer... mais bon on va supposer que si ce dossier n'est pas présent, les autres non plus :D


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 04-01-2013 à 09:30:04    

bardiel a écrit :


Google, 3ème réponse, 5 secondes [:the geddons]  


Merci mais j'avais déja essayé ce tuto. Si je post ici c'est pour avoir plus d'information...
Mais merci quand même je vais essayer ce que tu décris.


Message édité par Mc Kagan le 04-01-2013 à 09:50:44
Reply

Marsh Posté le 05-01-2013 à 13:38:26    

L'inconvenient c'est que find ne dispose pas d'une option contraire (dire "il manque le dossier Xa dans les dossiers A1, B8 et C3" ), donc il faut en gros tester l'absence des dossiers à créer (qui devraient être présents) sur chaque dossier de la racine de travail [:spamatounet]  
En torchant mieux le dernier script que j'ai indiqué, notamment l'adapter par rapport à cron avec un find sur le temps (dossiers créés les 6-12-24 dernières heures, pas besoin de tester un dossier créé il y a 6 mois...) et dans un environnement de production, ça devrait le faire.


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 08-01-2013 à 16:16:37    

Ok, je regarde ça. merci

Reply

Marsh Posté le 10-01-2013 à 14:56:43    

J'ai super bien avancé grâce à vos conseils! Par contre, j'ai un dernier problème. Lorsque la première boucle crée les sous-dossiers, la deuxième qui vas créer l'autre dossiers va aussi en créer un dans le sous-dossier précédemment crée.
Est-ce clair?    
 
Donc comment faire pour éviter cela?
 
Merci

Reply

Marsh Posté le 10-01-2013 à 16:43:09    

Il ressemble à quoi ton script au final ? A ce que j'ai indiqué auparavant ?
Si oui, normalement il ne va crée les 3 sous-dossiers que dans le dossier courant, car on a précisé au find une profondeur de 1.  
Si non, tu ajoutes un test de présence pour chaque sous-dossier du dossier courant (/partage) avec un find d'une profondeur de 1.
 
J'avais d'ailleurs oublié de t'indiquer l'option -ctime (voir le grand gogole pour les précisions dessus)


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 10-01-2013 à 17:03:34    

Voici pour le script:

 
Code :
  1. for DOCTLS in `find Prospection_* ! -name "DocsTLS" -type d`
  2. do
  3. mkdir -p $DOCTLS/DocsTLS
  4. done
  5. for DOCSCLIENT in `find Prospection_* ! -name "DocsClient" -type d`
  6. do
  7. mkdir -p $DOCSCLIENT/DocsClient
  8. done
 

Deuxième chose, comment créer des sous-dossiers dans une liste de dossier? Je pense que cela me sera au moins aussi utile.


Message édité par Mc Kagan le 10-01-2013 à 17:04:13
Reply

Marsh Posté le 11-01-2013 à 10:55:48    

Pour le script, il vaudrait mieux ne pas trop utiliser les mêmes dénominations entre dossier de travail et variable, et mettre le test de non-présence que j'avais utilisé [:spamatounet]  
Ensuite je mettrais du chemin absolu depuis la racine, si ton script n'est pas exécuter depuis l'emplacement des dossiers, ce qui pour du dossier clientèle est quand même mieux... on ne mélange pas les oignons et les choux de Bruxelles, donc tu mets tes scripts ailleurs qu'avec les données utilisateurs.
Enfin il manque un -maxdepth 1 à tes find.
Bon le script que j'avais proposé était quand même un poil mieux (le gars qui ne se lance pas des fleurs [:the geddons] )
 
Pour ton autre question, toujours voir le même script que le dernier que j'ai proposé, mais en utilisant un cat d'un fichier (au format texte Unix) avec une extraction ligne à ligne soit :
- un fichier "source.txt" (ouais pas taper, l'extention txt n'existe officiellement pas sous Linux et Unix, je sais :o )

/emplacement/toto
/emplacement2/tata
/emplacement3/titi


- un script :

#!/bin/bash  
while read line  
do  
f=$line
mkdir -p $f/{"sous-dossier1", "sous-dossier2"}  
fi  
done << cat source.txt


Donc dans une arborescence à la partir de la racine où j'ai :
- un dossier emplacement, sous-dossier toto
- un 2ème dossier emplacement2, sous-dossier tata
- un 3ème dossier emplacement, sous-dossier titi
A chaque, je crée 2 sous-sous dossiers "sous-dossier1" et "sous-dossier2".
Soit de

/emplacement/toto
/emplacement2/tata
/emplacement3/titi


je passe à ça :

/emplacement/toto/sous-dossier1
/emplacement/toto/sous-dossier2
/emplacement2/tata/sous-dossier1
/emplacement2/tata/sous-dossier2
/emplacement3/titi/sous-dossier1
/emplacement3/titi/sous-dossier2


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 11-01-2013 à 12:06:50    

Bon.... ça me semble pas mal tout ça. Je vais bûcher de mon coté ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed