Tak więc w przypadku bash
rozszerzenia 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 $IFS
oddzielną listę argumentów, których potrzebujesz, ale oznacza to, że prawdopodobnie lepiej po prostu użyć tej bash
rzeczy lub ją wpisać.
W każdym razie myślę, że tak właśnie bym to zrobił, choćby dlatego, że wywołuje się mkdir
tak 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ć, for
jedyne pętle raz na indeks tablicy parametrów pozycyjnych, które tutaj ustawiłem, po prostu przekazując sh
parametry przy wywołaniu, i powyżej za pomocą set ${positionals}
. Ale printf
otrzymuje 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|command
strumienia przesyła strumieniowo wszystkie dane for
wyjś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...done
konstrukcji.