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 $IFSdanh 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 mkdirthườ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 forvò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 shcác tham số khi gọi và ở trên với set ${positionals}. Nhưng printfnhậ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|commandluồ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 >filesẽ 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...donecấu trúc.