Então, com bash
a expansão do alfabeto, isso funciona:
set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p
E se você digitar o alfabeto uma vez na primeira linha, o mesmo conceito deve ser portátil para qualquer shell. Existem outras maneiras de chegar à linha definida, se você não quiser digitá-la como:
seq -sP32P 97 123|dc
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
... por exemplo, trabalha em um código de idioma ASCII. Então você pode fazer set $(seq -sP32P 97 123|dc)
ou qualquer outro comando que lhe forneça uma $IFS
lista separada dos argumentos de que você precisa, mas, quero dizer, provavelmente é melhor apenas usar a bash
coisa ou digitá-la.
Enfim, acho que é assim que eu faria, apenas porque invoca mkdir
quantas vezes for necessário.
E apenas para demonstrar como funciona, aqui está uma pequena saída de depuração de um conjunto menor:
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
Como você pode ver, os for
únicos loops uma vez por índice de matriz de parâmetros posicionais, que eu defini aqui simplesmente entregando sh
os parâmetros na invocação e acima com set ${positionals}
. Mas printf
recebe a mesma matriz em sua lista de argumentos para cada iteração e aplica sua cadeia de formatação a cada um de seus argumentos, para obter a aparência de recursão sem nenhuma recursão desnecessária.
E adicionar o done|command
fluxo de toda for
a saída de um loop sobre o canal da mesma maneira done >file
transmitiria tudo em um arquivo - apenas abrindo e fechando o arquivo de saída uma vez para toda a for...done
construção.