सभी पत्रों के लिए पुनरावर्ती निर्देशिकाएं बनाएं


12

मैं इस तरह से एक निर्देशिका बनाना चाहता हूं कि मुझे निर्देशिकाओं को लेबल करने की आवश्यकता aहै z। इन निर्देशिकाओं में से प्रत्येक के अंदर, मुझे उप-निर्देशिका बनाने की आवश्यकता है ताकि उन्हें लेबल किया जाए aa, abआदि।

इसलिए, उदाहरण के लिए, निर्देशिका के लिए m, मेरी उप-निर्देशिकाओं को लेबल किया जाएगा ma, mbतक mz


3
आप पहले mkdir की जरूरत नहीं है क्योंकि -p उपनिर्देशिका भी बना रहा है। और अगर आप abolute पाथ का उपयोग करते हैं तो आपको cd कमांड की आवश्यकता नहीं है। अन्यथा यह अच्छा है, काम कर रहा है, चर घोषित किया गया है, आदि माइकल होमर का संस्करण छोटा है और शायद इसका प्रदर्शन बेहतर है, लेकिन इस तरह के एक सरल कार्य के लिए आपका काफी अच्छा होगा।

1
दिन में वापस अधिक टर्मिनस प्रविष्टियाँ थीं और कोई बैश {az ”वाक्यविन्यास नहीं था, इसलिए मैं /usr/share/terminfo[az] के साथ सूची बनाऊँगा और उस आउटपुट का उपयोग करूँगा । लिनक्स उस गिनती पर बहुत विरल है, जिसका उपयोग सभी ऊपरी और निचले मामलों के पात्रों और अंकों के लिए प्रविष्टियां होने के लिए किया जाता है।
स्कीइंग

जवाबों:


19

प्रयत्न:

for x in {a..z} ; do mkdir -p $x/${x}{a..z} ; done

बैश का विस्तार होगा XXX{a..z}के लिए बाहर XXXa, XXXb, और इतने पर। आपके पास आंतरिक लूप की कोई आवश्यकता नहीं है।

उसके बाद:

$ ls
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
$ ls m
ma  mc  me  mg  mi  mk  mm  mo  mq  ms  mu  mw  my
mb  md  mf  mh  mj  ml  mn  mp  mr  mt  mv  mx  mz

7

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


3

से यहाँ , मैं इस तरह एक स्क्रिप्ट बना दी। हालांकि, अगर मुझे एक सुरुचिपूर्ण समाधान मिलता है, तो मैं इसे एक उत्तर के रूप में स्वीकार करूंगा।

for x in {a..z}
do
    mkdir -p /home/ramesh/$x
    cd /home/ramesh/$x
    for y in {a..z}
    do
        mkdir -p /home/ramesh/$x/$x$y
    done
done

+1, अच्छा प्रश्न और बेहतर उत्तर :)
नाडु जूल

@ नेटवर्कर, मुझे यकीन है कि यह एक बहुत अच्छा समाधान है। कुछ विशेषज्ञ उत्तर की प्रतीक्षा कर रहे हैं, जो इस उत्तर के समान ही काम करेंगे, लेकिन बहुत कूल लगेंगे :)
रमेश

सख्ती से बोलना, यह आवश्यक नहीं है जब आप जानते हैं कि चर मान क्या होने जा रहे हैं (और वे सरल तार हैं), लेकिन अपने चर को उद्धृत करने की आदत में आना एक अच्छा विचार है। आप उपयोग कर सकते हैं /home/ramesh/"$x"/"$x$y", /home/ramesh/"$x/$x$y"या "/home/ramesh/$x/$x$y"- वे सभी समान हैं।
स्कॉट

1

में Perl:

perl -MFile::Path=make_path -e '
    make_path(map { $l=$_; map { "$l/$l$_" } a..z } a..z)
'

File::Pathकब से कोर मॉड्यूल है Perl 5.001

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.