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