Tak więc w przypadku bashrozszerzenia alfabetu działa to:
set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p
A jeśli po prostu wpiszesz alfabet raz w pierwszym wierszu, ta sama koncepcja powinna być przenośna dla dowolnej powłoki. Istnieją inne sposoby dotarcia do ustawionej linii, jeśli nie chcesz jej wpisywać:
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
... na przykład działa w ustawieniach ASCII. Możesz więc wykonać set $(seq -sP32P 97 123|dc)dowolną inną komendę, która da ci $IFSoddzielną listę argumentów, których potrzebujesz, ale oznacza to, że prawdopodobnie lepiej po prostu użyć tej bashrzeczy lub ją wpisać.
W każdym razie myślę, że tak właśnie bym to zrobił, choćby dlatego, że wywołuje się mkdirtak często, jak to konieczne.
Aby pokazać, jak to działa, oto mały wynik debugowania mniejszego zestawu:
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
Jak widać, forjedyne pętle raz na indeks tablicy parametrów pozycyjnych, które tutaj ustawiłem, po prostu przekazując shparametry przy wywołaniu, i powyżej za pomocą set ${positionals}. Ale printfotrzymuje tę samą tablicę z listy argumentów dla każdej iteracji i stosuje ciąg formatu do każdego z argumentów, dzięki czemu uzyskuje się pozór rekurencji bez zbędnej rekurencji.
A dodanie done|commandstrumienia przesyła strumieniowo wszystkie dane forwyjściowe pętli przez potok w ten sam sposób done >file, przesyła je strumieniowo do pliku - otwierając i zamykając plik wyjściowy tylko raz dla całej for...donekonstrukcji.