Manière automatisée de créer une arborescence de répertoires

11

J'essaie de créer une arborescence de répertoires de A à Z où le répertoire suivant se trouve dans le répertoire actuel.

Par exemple: B est dans A et C est dans B et ainsi de suite.

-A
--B
---C
----...Z

Des indices sur la façon de le faire de manière automatisée?

Nish
la source
Je me demande quel est le but pratique de ces répertoires. À mon humble avis, cela ressemble plus à une question pour Code Golf .
Melebius
3
@Melebius L'un des objectifs possibles est de créer une structure de répertoires en tant que scénario de test, afin de vérifier que d'autres propriétés de commande, de script ou d'application fonctionnent. Voici un exemple récent où la question elle-même n'était pas de créer des structures de répertoires spécifiques, mais savoir comment écrire des commandes pour le faire était utile à des fins de test, non malgré la façon dont la structure spécifique était artificielle et bizarre, mais à cause de cela. (Nous avons également de nombreuses questions sur la création de structures de répertoires spécifiques, que vous pouvez trouver en recherchant " mkdir -p".)
Eliah Kagan

Réponses:

25

Avec mkdir, printfet l'expansion de l'accolade de bash:

$ mkdir -p "$(printf "%s/" {A..Z})"
$ tree A
A
└── B
    └── C
        └── D
            └── E
                └── F
                    └── G
                        └── H
                            └── I
                                └── J
                                    └── K
                                        └── L
                                            └── M
                                                └── N
                                                    └── O
                                                        └── P
                                                            └── Q
                                                                └── R
                                                                    └── S
                                                                        └── T
                                                                            └── U
                                                                                └── V
                                                                                    └── W
                                                                                        └── X
                                                                                            └── Y
                                                                                                └── Z

25 directories, 0 files
  • {A..Z}se développe en A B ... Z,
  • printf "%s/"affiche les arguments avec un /après eux, donc je reçoisA/B/...Z/
  • et mkdir -pcrée le A/B/.../Zrépertoire avec tous les répertoires parents à créer.
muru
la source
Merci pour ça. Je pensais avoir cette erreur pendant. J'utilise la commande mkdir: A / B / C / D / E / F / G / H / I / J / K / L / M / N / O / P / Q / R / S / T / U / V / W / X / Y: Aucun fichier ou répertoire de ce type
Nish
3
@Nish Il y a un -pdans la mkdircommande.
muru
mon mauvais, j'ai essayé ça sur mon mac au lieu d'ubuntu. Et une question de suivi est la suivante -> disons que je voulais avoir le répertoire A1..A100 dans A (dans la même structure AtoZ). Puis B1..B100 dans B. Donc cela ressemble à quelque chose comme ça -> imgur.com/jfuKEdf
Nish
11
Supposons que vous postez un suivi en tant que question réelle plutôt que dans les commentaires, et que vous n'utilisiez pas d'images mais de texte. Ce serait beaucoup mieux, non?
muru
Je comprends votre point ici. C'est difficile de le poster car ce n'est pas un code et c'est une sortie énorme à cela. Il suffit donc de regarder la capture d'écran pour la comprendre plus facilement.
Nish
7

Au niveau très simple, vous pouvez utiliser l' {A..Z}expansion pour générer toute la lettre, puis créer et saisir de manière itérative chacune:

~/test_directory$ for d in {A..Z}; do mkdir "$d"; cd "$d"; done
~/test_directory/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z$ 

Comme vous pouvez le voir dans ma sortie d'invite, vous avez maintenant un répertoire complètement enchaîné.

Cependant, si les noms de répertoire réels sont différents de l'alphabet, vous devrez en quelque sorte fournir la liste des noms de répertoire, peut-être via un fichier, sur lequel vous répétez et répétez le même processus. Fondamentalement, cela

while IFS= read -r dir_name;do mkdir "$dir_name"; cd "$dir_name" ;done < directory_list.txt
Sergiy Kolodyazhnyy
la source
c'est plutôt cool. Voici une question de suivi. disons que je voulais avoir le répertoire A1..A100 dans A (dans la même structure AtoZ). Puis B1..B100 dans B. Donc cela ressemble à quelque chose comme ça -> imgur.com/jfuKEdf
Nish
@Nish ah, cela nécessiterait une boucle intérieure doncfor d in {A..Z}; do mkdir "$d"; cd "$d"; for i in {1..100}; do mkdir "${d}${i}" ;done ; done
Sergiy Kolodyazhnyy
Ou même sans boucle intérieure,for d in {A..Z}; do mkdir "$d"; cd "$d"; mkdir "$d"{1..100}; done
Sergiy Kolodyazhnyy
Merci pour ça. Il semble fonctionner mais l'ordre du répertoire semble foiré, donc 2 n'est pas après 1. Son tri au hasard. Quoi qu'il en soit pour résoudre ce problème? Voici une capture d'écran -> imgur.com/a/Zqj1c
Nish
@Nish L'ordre de tri est basé sur du texte, pas numérique comme je pense que vous vous y attendez. Pour autant tree, je ne sais pas comment résoudre ce problème, mais je pense que ce n'est peut-être même pas treele problème, mais plutôt l'ordre de tri du shell. Je suggère de poser une question réelle à ce sujet ici ou mieux encore sur unix.stackexchange.com
Sergiy Kolodyazhnyy
2

Même si la printfvoie de muru est imbattable, j'aime personnellement jotce genre de chose. jotn'est pas installé par défaut dans Ubuntu. Le athena-jotpackage le fournit. L'une ou l'autre de ces commandes fonctionne:

mkdir -p "$(jot -s/ -c 26 A)"
jot -s/ -c 26 A | xargs mkdir -p

Vraiment, toute commande qui génère la séquence de lettres et les joint avec des barres obliques facilitera cela, car sa sortie peut ensuite être transmise mkdir -psoit par substitution de commande (comme dans la réponse de muru ) soit en utilisant xargs. Voici quelques exemples utilisant quelques outils et xargsqui ne nécessitent pas l'installation de logiciels, sauf peut-être sur des systèmes très minimaux ou Ubuntu Core:

perl -we 'print join "/", A..Z' | xargs mkdir -p
ruby -we 'print (?A..?Z).to_a * ?/' | xargs mkdir -p
python3 -c 'print("/".join(__import__("string").ascii_uppercase))' | xargs mkdir -p

Old versions d' Ubuntu viennent avec Python 2 au lieu de Python 3. Pour cela, il suffit de changer python3pour pythonfaire ce dernier travail de commande, si vous voulez vraiment faire cela avec Python.

De même, la manière courte et simple de muru peut alternativement s'écrire:

printf '%s/' {A..Z} | xargs mkdir -p

La fin /, dans le chemin du répertoire mkdir -pest invité à créer, ne pose aucun problème et est sans doute préférable d'un point de vue stylistique. Mais c'est bien de l'omettre, comme le font les autres exemples de cette réponse.

Eliah Kagan
la source