तो, 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निर्माण के लिए आउटपुट फाइल को एक बार खोलने और बंद करने का ।