Quindi, con bashl'espansione dell'alfabeto, funziona:
set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p
E se scrivi semplicemente l'alfabeto una volta nella prima riga, lo stesso concetto dovrebbe essere portabile su qualsiasi shell. Esistono altri modi per arrivare alla linea impostata se non si desidera digitarla come:
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
... ad esempio funziona in una locale ASCII. Quindi potresti fare set $(seq -sP32P 97 123|dc)o qualsiasi altro comando che ti $IFSprocurerebbe un elenco separato degli argomenti di cui hai bisogno, ma, intendo, probabilmente è meglio solo usare la bashcosa o digitarla.
Ad ogni modo, penso che sia il modo in cui lo farei se non altro perché invoca solo tutte mkdirle volte che è necessario.
E solo per dimostrare come funziona, ecco un piccolo output di debug di un set più piccolo:
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
Come puoi vedere, gli forunici loop una volta per indice di array di parametri posizionali, che ho impostato semplicemente passando shi parametri su invocazione, e sopra con set ${positionals}. Ma printfriceve lo stesso array nel suo elenco di argomenti per ogni iterazione e applica la sua stringa di formato a ciascuno dei suoi argomenti, in modo da ottenere la parvenza di ricorsione senza inutili ricorsioni.
E aggiungendo lo done|commandstream tutto forl'output di un loop sulla pipe allo stesso modo done >filelo streaming tutto in un file - aprendo e chiudendo il file di output solo una volta per l'intero for...donecostrutto.