web-dev-qa-db-fra.com

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

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?

11
Nish

Avec mkdir, printf et le développement 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} passe à A B ... Z,
  • printf "%s/" affiche les arguments avec un / après eux, donc je reçois A/B/...Z/
  • et mkdir -p crée le répertoire A/B/.../Z avec tous les répertoires parents à créer.
25
muru

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

~/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 la sortie de mon invite, vous avez maintenant un répertoire complètement chaîné.

Toutefois, si les noms de répertoires diffèrent de l'alphabet, vous devrez fournir la liste des noms de répertoires, éventuellement via un fichier, sur lequel vous pourrez effectuer une nouvelle itération et la même procédure. Fondamentalement, cette

while IFS= read -r dir_name;do mkdir "$dir_name"; cd "$dir_name" ;done < directory_list.txt
7

Même si façon printf de Mur est imbattable, j'aime personnellement jot pour ce genre de chose. jot n'est pas installé par défaut dans Ubuntu. Le paquet athena-jot 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

En réalité, toute commande générant la séquence de lettres et les associant à des barres obliques facilitera cette opération, car sa sortie peut ensuite être transmise à mkdir -p soit via [substitution de commande (comme dans - réponse de mur ) ou en utilisant xargs . Voici quelques exemples utilisant quelques outils et xargs qui ne nécessitent pas l’installation de logiciel, 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

Les anciennes versions d'Ubuntu sont accompagnées de Python 2 au lieu de Python 3. Pour cela, il suffit de changer python3 en python pour que cette dernière commande fonctionne, si vous voulez vraiment le faire avec Python.

De même, manière simple et brève de mur peut aussi être écrit:

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

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

2
Eliah Kagan