Créer récursivement des directorys pour toutes les lettres

Je veux créer un directory de telle sorte que j'ai besoin d'étiqueter les directorys de a à z . À l'intérieur de chacun de ces directorys, j'ai besoin de créer des sous-directorys pour qu'ils soient étiquetés comme aa , ab etc.

Ainsi, par exemple, pour le directory m , mes sous-directorys seront étiquetés comme ma , mb jusqu'à mz .

Essayer:

 for x in {a..z} ; do mkdir -p $x/${x}{a..z} ; done 

Bash étendra XXX{a..z} à XXXa , XXXb , et ainsi de suite. Il n'y a pas besoin de la boucle intérieure que vous avez.

Après ça:

 $ ls abcdefghijklmnopqrstu vwxyz $ ls m ma mc me mg mi mk mm mo mq ms mu mw my mb md mf mh mj ml mn mp mr mt mv mx mz 

Donc, avec la chose d'expansion de l'alphabet de bash , cela fonctionne:

 set {a..z} for a do printf "./$a/$a%s\n" "$@" done | xargs mkdir -p 

Et si vous tapez simplement l'alphabet une fois sur la première ligne, le même concept devrait être portable sur n'importe quel shell. Il y a d'autres façons d'arriver à la ligne définie si vous ne voulez pas la taper comme:

 seq -sP32P 97 123|dc abcdefghijklmnopqrstu vwxyz 

… par exemple fonctionne dans un environnement local ASCII. Vous pouvez donc set $(seq -sP32P 97 123|dc) ou toute autre command qui vous permettrait d'get une list séparée des arguments dont vous avez besoin, mais il vaut probablement mieux utiliser le bash ou taper.

Quoi qu'il en soit, je pense que c'est comme ça que je le ferais, ne serait-ce que parce qu'il invoque mkdir aussi souvent que nécessaire.

Et juste pour démontrer comment cela fonctionne, voici un petit debugging d'un petit set:

 sh -cx 'for n do printf "./$n/$n%s\n" "$@"; done|cat' -- arg1 arg2 arg3 + for n in '"$@"' + printf './arg1/arg1%s\n' arg1 arg2 arg3 + cat + for n in '"$@"' + printf './arg2/arg2%s\n' arg1 arg2 arg3 + for n in '"$@"' + printf './arg3/arg3%s\n' arg1 arg2 arg3 ./arg1/arg1arg1 ./arg1/arg1arg2 ./arg1/arg1arg3 ./arg2/arg2arg1 ./arg2/arg2arg2 ./arg2/arg2arg3 ./arg3/arg3arg1 ./arg3/arg3arg2 ./arg3/arg3arg3 

Comme vous pouvez le voir, les loops for only, une fois par index de tableau de parameters de position, que je définis ici en passant simplement les parameters à l'invocation, et au-dessus avec set ${positionals} . Mais printf reçoit le même tableau dans sa list d'arguments pour chaque itération et applique sa string de format à chacun de ses arguments, de sorte que vous obtenez le semblant de récursivité sans récursivité inutile.

Et l'ajout de la done|command streamera la totalité de la sortie d'une boucle sur le canal de la même manière done >file le relierait tous dans un file – ouvrant et fermant le file de sortie une seule fois pour la construction complète for...done .

De là , j'ai fini par créer un script comme celui-ci. Cependant, si j'obtiens une solution élégante, je l'accepterai comme une réponse.

 for x in {a..z} do mkdir -p /home/ramesh/$x cd /home/ramesh/$x for y in {a..z} do mkdir -p /home/ramesh/$x/$x$y done done 

En Perl :

 perl -MFile::Path=make_path -e ' make_path(map { $l=$_; map { "$l/$l$_" } a..z } a..z) ' 

File::Path est le module de base depuis Perl 5.001 .