Отже, з bash
річчям розширення алфавіту це працює:
set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p
І якщо ви просто введіть алфавіт один раз у першому рядку, той самий концепт повинен бути переносним до будь-якої оболонки. Існують і інші способи перейти до заданої лінії, якщо ви не хочете вводити її так:
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
... наприклад працює в ASCII-локалі. Таким чином, ви можете зробити set $(seq -sP32P 97 123|dc)
або будь-яку іншу команду, яка отримає вам $IFS
окремий список потрібних аргументів, але, я маю на увазі, це, мабуть, краще просто використати bash
річ або набрати її.
У будь-якому випадку, я думаю, що саме так я зробив би, якби тільки тому, що він викликає лише mkdir
стільки разів, скільки потрібно.
А щоб просто продемонструвати, як це працює, ось невеликий вихід налагодження меншого набору:
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
Як бачите, for
єдиний цикл один раз за індексом масиву позиційних параметрів, який я тут встановлюю, просто передаючи sh
параметри при виклику та вище з set ${positionals}
. Але він printf
отримує той самий масив у своєму списку аргументів для кожної ітерації та застосовує його рядок формату до кожного з його аргументів, тож ви отримуєте схожість рекурсії без зайвої рекурсії.
І додавання done|command
волі потоком всього виходу for
циклу через трубу таким же чином done >file
передасть це все у файл - лише відкриваючи та закриваючи вихідний файл один раз для всієї for...done
конструкції.