Quindi, con bash
l'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 $IFS
procurerebbe un elenco separato degli argomenti di cui hai bisogno, ma, intendo, probabilmente è meglio solo usare la bash
cosa o digitarla.
Ad ogni modo, penso che sia il modo in cui lo farei se non altro perché invoca solo tutte mkdir
le 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 for
unici loop una volta per indice di array di parametri posizionali, che ho impostato semplicemente passando sh
i parametri su invocazione, e sopra con set ${positionals}
. Ma printf
riceve 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|command
stream tutto for
l'output di un loop sulla pipe allo stesso modo done >file
lo streaming tutto in un file - aprendo e chiudendo il file di output solo una volta per l'intero for...done
costrutto.