Créations sous-répertoires multiples

Bonjour,

A la racine de mon disque p: j'ai environ 500 dossiers, dans chacun des dossiers se trouve 1 sous dossier nommé DIVERS et plusieurs sous dossiers ayant des noms différents (nom d'entreprise).

J'ai besoin de créer 2 dossiers, nommés TOTO et LULU par exemple, dans chacun des sous dossiers portant le nom d'entreprise, sauf dans le sous dossier divers

en gros il me faut : p:\nom_dossier\nom_rep\TOTO
et p:\nom_dossier\nom_rep\LULU MAIS PAS p:\nom_dossier\DIVERS\

J'ai une partie du script mais le problème c'est que les sous-répertoire ne sont pas créés au bon emplacement, ils se créent dans l'arborescence au même niveau que DIVERS !!!!

@echo off
for /d %%d in (*) do ( mkdir "%%d\TOTO"
)
pause
@echo off
for /d %%d in (*) do ( mkdir "%%d\LULU"
)
pause

Je sais pas comment faire ni même si cela est possible comme les dossiers principaux ont tous des noms différents et les sous répertoires aussi.
Si quelq'un peut m'aider ça m'éviterai de tout faire manuellement pour les 500 dossiers !!! =)
Merci

7 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Le problème porte sur la création récursive de dossiers TOTO et LULU dans chaque sous-dossier portant un nom d'entreprise sous la racine, en excluant le sous-dossier DIVERS, sans modifier l'arborescence. Des solutions proposées incluent des boucles imbriquées pour traiter chaque sous-répertoire, puis des appels mkdir pour TOTO et LULU dans ces chemins, afin de préserver l'emplacement relatif. En cas de noms avec espaces, l’usage des guillemets autour des chemins et la gestion des résultats via for et echo permet d’éviter les créations hors emplacement. Certaines réponses suggèrent également d’exclure DIVERS par filtrage de répertoires ou d’adapter la liste des répertoires afin que TOTO et LULU n’apparaissent pas dans DIVERS.

Bobot (l’IA à votre service)
  1. Bonjour,

    Je partirais plutôt sur deux boucles imbriquées pour ma part :
    @echo off
    for /d %%d in (*) do (
        for /d %%s in (%%d\*) do (
            mkdir "%%s\LULU"
            mkdir "%%s\TOTO"
        )
    )
    pause 
    


    Xavier
    1. ah oui tien tres bonne idée, je n'y avais pas penser, mais ca a de grandes chances de fonctionner.
    2. Merci bcp, tout fonctionne =)
    3. en fait j'ai un petit soucis, mes 500 répertoires principaux ont des noms qui contiennent des espaces, tiret... et du coup ça bug avec le script, ça me cré 500 répertoires supplémentaires dans lesquels les répertoires lulu et toto sont créés !!! :S
    4. il faut entourer les adresses de " "
    5. j'ai pourtant mis les " " autour de chaque chemin
  2. Bonjour,
    Je comprend pourquoi mais malheureusement je ne posséde pas de solutions pour le moment a ton problème.
    1. tan pis, merci quand même !!
      1. ton code m'as l'air fortement complexe
        à la rigueur je ne sait pas si cela est possible mais tu pourrais peut-être del les sous-dossier divers dans chaque dossier (je ne sais pas si il y a quelquechose dedans, ou alors les bouger peut-être sinon, et après, tu répertorie effectivement les chemins des nom de dossier entreprise pour créer les documents que tu veut dedans, et après redéplacer les dossiers divers si tu as besoin.
        Je sais que ca a l'air farfelue mais je ne m'y connais pas assez en MS-DOS pour te donner d'autres solutions, par contre si tu ne le sais pas je peut te dire, qu'il est inutile de faire 2 boucles pour créer 2 fichiers dans le même dossier, écrire les actions l'une à la suite de l'autre est suffisant et si tu tien à la pause, tu la met dans la boucle juste après tes deux actions.

        Voila j'espère que cela t'aideras un peu quand même.
    2. Contributeur
      hello
      essayer
      @echo off 
      for /f %%d in ('dir /a:d /b ^| find /v "DIVERS" ') do (
        mkdir "%%d\TOTO" 
        mkdir "%%d\LULU" 
      ) 
      pause 
      1. Bonjour Gawouelle,

        Avec Python, on peut atteindre ce que l'on veut comme résultat d'un traitement de fichiers ou de dossiers, quelle que soit la complexité voulue pour ce résultat et la complexité des noms et de l'arborescence initiaux.
        Python est très bon pour de telles taches.
        Je peux t'aider à réaliser ce que tu veux faire si tu consens à utiliser Python.
        Si c'est le cas tu peux commencer de regarder cette réponse :

        https://forums.commentcamarche.net/forum/affich-23118470-script-pour-deplacer-les-fichiers#7

        qui te donneras aussi une idée de l'aisance que procure Python pour atteindre ses objectifs.
        1. je disais, dans un post qu'on vient de me censurer:

          j'aimerais savoir pourquoi mon post ci-dessus a été downvoté
          mais que je craignais que le/la lâche feignant(e) qui l'a fait ne viendra pas me répondre
        2. Va savoir... des fois il se passe des trucs bizarres dans les notes :-/
          Allez, j'te mets +1 parce que même si c'est un peu hors sujet, python est effectivement adapté au problème, et surtout est beaucoup plus facilement débugable que du batch, cf les problèmes bizarres d'espaces qu'on a...
        3. Merci Reivax962.
          Bien que, tu t'en doutes, ce ne soit pas le fait d'avoir un -1 qui m'énerve. C'est de voir qu'il y a un !:**%#!§ qui a downvoté pour une raison tordue. Soit contre moi, soit contre Python. Sans aucune explication, c'est niais et lamentable

          Pourquoi "hors sujet" ? Si c'est adapté, ce n'est pas hors-sujet.

          Soit dit en passant , aucun problème de caractère à débugger en écrivant ce code.
          J'ai essayé sur des dossier nommés 'bu du du' et 'oro-oro' , pour créer 'TU - TU' et 'TO _ T ! O' : passé impeccable
        4. > Pourquoi "hors sujet" ? Si c'est adapté, ce n'est pas hors-sujet

          Tu as raison, j'étais tellement parti « batch » que je pensais que la demande initiale réclamait du batch... Or à la relecture, ce n'est pas le cas :)
      2. Voilà, j'ai mis 1/4 d'heure pour pondre le code en Python.
        A priori , il est portable sur n'importe quelle plateforme

        from os import listdir,mkdir 
        from os.path import isdir,islink,join 
        
        
        def dossiers_dans(dirpath): 
            return (join(dirpath,x) for x in listdir(dirpath) if isdir(join(dirpath,x)) and not islink(join(dirpath,x)) ) 
        
        ecr = [] 
        for dossier in dossiers_dans('pp:'): 
            ecr.append('  '+dossier+'\n') 
            for sous_dossier in dossiers_dans(dossier): 
                ecr.append(sous_dossier) 
                if not sous_dossier.endswith('DIVERS'): 
                    ecr.append('creating LULU et TOTO dans ' + sous_dossier + '\n') 
                    mkdir(join(sous_dossier,'LULU')) 
                    mkdir(join(sous_dossier,'TOTO')) 
            ecr.append('\n-------------------------------------\n') 
        
        
        print '\n'.join(ecr)


        La fonction dossier_dans() renvoie un générateur