Vì vậy, với bash
điều mở rộng bảng chữ cái, điều này hoạt động:
set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p
Và nếu bạn chỉ cần gõ bảng chữ cái một lần trong dòng đầu tiên, khái niệm tương tự sẽ có thể được chuyển sang bất kỳ shell nào. Có nhiều cách khác để đến dòng đã đặt nếu bạn không muốn nhập nó như sau:
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
... ví dụ hoạt động trong một miền địa phương ASCII. Vì vậy, bạn có thể thực hiện set $(seq -sP32P 97 123|dc)
hoặc bất kỳ lệnh nào khác sẽ giúp bạn có một $IFS
danh sách riêng các đối số bạn cần, nhưng, ý tôi là, có lẽ tốt hơn là chỉ sử dụng bash
điều đó hoặc nhập nó.
Dù sao, tôi nghĩ đó là cách tôi sẽ làm nếu chỉ vì nó chỉ gọi mkdir
thường xuyên khi cần thiết.
Và chỉ để chứng minh cách thức hoạt động của nó, đây là một đầu ra gỡ lỗi nhỏ của một tập nhỏ hơn:
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
Như bạn có thể thấy, các for
vòng lặp duy nhất một lần cho mỗi chỉ số mảng tham số vị trí, mà tôi đặt ở đây bằng cách chỉ cần bàn giao sh
các tham số khi gọi và ở trên với set ${positionals}
. Nhưng printf
nhận được cùng một mảng trong danh sách đối số của nó cho mỗi lần lặp và áp dụng chuỗi định dạng của nó cho từng đối số của nó, do đó bạn có được ngữ nghĩa của đệ quy mà không có đệ quy không cần thiết.
Và việc thêm done|command
luồng ý chí tất cả for
đầu ra của vòng lặp qua đường ống theo cùng một cách done >file
sẽ truyền tất cả vào một tệp - chỉ mở và đóng tệp đầu ra một lần cho toàn bộ for...done
cấu trúc.