Mkdir का उपयोग करके कई निर्देशिकाएँ बनाना


14

मैं कई निर्देशिकाओं का उपयोग करके बनाना चाहूंगा mkdir। प्रत्येक निर्देशिका नाम में एक उपसर्ग (एक स्ट्रिंग) और एक सूचकांक (एक पूर्णांक) शामिल होगा। मान लीजिए कि मैं उपसर्ग "s" और सूचकांकों को 1 से लेकर 50 तक की सीमा तक चाहूंगा। इसका मतलब है कि मैं निर्देशिकाओं का शीर्षक बनाना चाहूंगा:

s1,, s2... s49,,s50

क्या यह स्वचालित रूप से उपयोग करने का एक तरीका है mkdir? आपके समय के लिए धन्यवाद।


2
आप किस खोल का उपयोग कर रहे हैं?
फ्रांसेस्को तुर्को सेप

@FrancescoTurco मैं उपयोग कर रहा हूं bash। अपना समय देने के लिए धन्यवाद!
एंड्रयू

3
FYI करें, मैं इसे खोजने के लिए बहुत अधिक उपयोगी, निश्चित-चौड़ाई सूचकांकों का उपयोग करने की तरह: s01, s02, ..., s49, s50। यदि मैंने निश्चित-चौड़ाई वाले सूचकांकों का उपयोग किया है, तो /bin/lsलगभग हमेशा उस ऑर्डर का उत्पादन होता है जो मुझे चाहिए।
रोब

जवाबों:


32

आप इसे शेल स्क्रिप्ट के साथ कर सकते हैं।

शुद्ध श - यह पूर्व-पोसिक्स बॉर्न शेल पर भी काम करेगा:

n=1;
max=50;
while [ "$n" -le "$max" ]; do
  mkdir "s$n"
  n=`expr "$n" + 1`;
done

यदि आप अधिक संख्या में निर्देशिका बनाना चाहते हैं, तो आप स्क्रिप्ट mkdirको परीक्षण और अंकगणित के लिए शेल बिल्डिंस का उपयोग करने के साथ-साथ एकल कॉल तक कम कर सकते हैं । ऐशे ही:

n=1
max=50
set -- # this sets $@ [the argv array] to an empty list.

while [ "$n" -le "$max" ]; do
    set -- "$@" "s$n" # this adds s$n to the end of $@
    n=$(( $n + 1 ));
done 

mkdir "$@"

Zsh, ksh93 या बैश इसे बहुत आसान बनाते हैं, लेकिन मुझे यह इंगित करना चाहिए कि यह निर्मित नहीं है mkdirऔर अन्य गोले में काम नहीं कर सकता है। बड़े मामलों के लिए, यह तर्कों की संख्या या कुल आकार पर सीमा से प्रभावित हो सकता है जो एक कमांड में पारित हो सकते हैं।

mkdir s{1..50}

3
+1 यह बहुत अच्छा है! मैं एक बात के बारे में nitpick होगा, हालांकि: n=$(( n + 1 ))बस सख्ती से POSIX के रूप में किया गया है और आप एक उप लागत नहीं होगा।
कोजीरो

@rahmu [[कीवर्ड POSIX नहीं है। (ऐसा नहीं है कि उल्लेख करने के लिए [ है कई आधुनिक गोले में एक खोल builtin।)
Kojiro

@kojiro: [[मेरे काम करता है ksh88(जो पूर्वसूचक है bash) तो मैंने यह मान लिया कि यह पॉसिक्स था। मुझे इसका कोई उल्लेख POSIX कल्पना में नहीं मिला, इसलिए मेरा मानना ​​है कि आप सही हैं। जानकारी के लिए धन्यवाद!
रहमू

मैंने अंकगणितीय विस्तार का उपयोग करके एक संस्करण जोड़ने के बारे में सोचा था, लेकिन "प्योर श" को उस सामान तक सीमित करना चाहता था जो प्री-पॉसिक्स संस्करणों पर भी काम करता होगा। मैंने भी seq का उसी कारण से उल्लेख नहीं किया है - यदि आपने seq किया है तो आपके पास शायद बैश है। बड़ी संख्या में निर्देशिकाओं के लिए तर्क सीमा को दरकिनार करने के लिए लूप उदाहरण भी अच्छा है, जिसका अर्थ यह भी है कि for i in {range}उन्नत गोले के उपयोगकर्ताओं के लिए एक जगह है ।
रैंडम 832

अंत में zsh संकेत अद्भुत है, यह मुझे इतना समय बचा लिया!
जस

33
  • एक

    for i in {1..50}; do
      mkdir s"$i"
    done
    
  • दो

    mkdir s{1..50}

    यह विकल्प बाश , zsh और ksh93 में काम करता है

  • तीन

    mkdir $(printf "s%02i " $(seq 1 50))

4
आप कभी भी दो में से एक का उपयोग क्यों करेंगे?
केविन

7
आप $iकेवल एक निर्देशिका बनाने की तुलना में अधिक करना चाहते हैं mkdir s$i ; echo $i > s$i/$i। इसके अलावा, एक बैश में लूप के लिए उपयोग करने का एक अच्छा, सरल उदाहरण है ... इस तरह की साइट पर यह नौसिखिया उपयोगकर्ता के लिए इसे देखने और "अच्छा, सोचने के लिए बिल्कुल भी संभावना नहीं है, मुझे एहसास नहीं हुआ कि आप ऐसा कर सकते हैं" --->> आत्मज्ञान।
कैस

1
@ प्रहमु यह बैश / ज़श (शायद ksh93 भी) में पाया गया एक फीचर है। नीचा दिखाने की जरूरत नहीं।
हेल्परमेथोड

3
@ इल्मू: मुझे लगता है कि किसी को केवल इस बात पर विचार करना चाहिए कि अगर जोनाथन का जवाब ओपी के खोल (बैश) के साथ समस्या को ठीक करता है, जरूरी नहीं कि वह दूसरों के साथ हो।
फ्रांसेस्को तुर्को सेप

4
@ केविन जबकि यह पचास के लिए एक मुद्दा होने की संभावना नहीं है, अगर आपको पांच सौ निर्देशिकाएं मिल गई हैं तो आप तर्क सीमा के बारे में चिंता कर सकते हैं।
रैंडम 832

10

बहुत सारे जटिल जवाब यहाँ, लेकिन बैश यह वास्तव में आसान बनाता है। ज़रूर, शुद्ध POSIX समाधान काम करता है, लेकिन bashआप किसी भी तरह से उपयोग किए जाने वाले शेल का लाभ क्यों नहीं उठाते हैं? आप इसे ब्रेस विस्तार के साथ आसानी से कर सकते हैं :

% mkdir -v s{1..10} && ls -1d s{1..10}                                   (09-24 17:37)
mkdir: created directory `s1'
mkdir: created directory `s2'
mkdir: created directory `s3'
mkdir: created directory `s4'
mkdir: created directory `s5'
mkdir: created directory `s6'
mkdir: created directory `s7'
mkdir: created directory `s8'
mkdir: created directory `s9'
mkdir: created directory `s10'
s1
s10
s2
s3
s4
s5
s6
s7
s8
s9

5

mkdir $(seq --format 's%.0f' 1 50)

या यदि आप शून्य-गद्देदार संख्याएँ चाहते हैं (जो छँटाई के लिए बेहतर होगी):

mkdir $(seq --format 's%02.0f' 1 50)

या:

mkdir s$(seq -s ' s' -w 1 50)- स्ट्रिंग के 's' पर ध्यान दें $(), इसके बिना बनाई गई पहली निर्देशिका 's01' के बजाय सिर्फ '01' होगी।

और अंत में: mkdir $(printf "s%02i " $(seq 1 50))

seq GNU Coreutils से है

विचित्र रूप से, seq --formatया -fविकल्प केवल printf के फ्लोटिंग पॉइंट डबल टाइप्स की अनुमति देता है (जैसे f और g। यह भी एक अजीब फ्लोटिंग पॉइंट हेक्स फॉर्मेट है, जिसका मैंने कभी कोई उपयोग नहीं किया है)। मुझे कोई जानकारी नहीं है की क्यों। यह अच्छा होगा यदि यह अन्य printf(3)संख्यात्मक प्रकारों जैसे पूर्णांक (डी, आई), ऑक्टल (ओ, यू) या हेक्स (एक्स, एक्स) का भी समर्थन करता है।

वैसे भी, जैसे 0 दशमलव परिशुद्धता के साथ एक डबल प्रारूप %.0fया %02.0fइस उद्देश्य के लिए एक पूर्णांक के पास पर्याप्त है।

$ seq --help
उपयोग: seq [विकल्प] ... पिछला
  या: seq [विकल्प] ... सबसे पहले
  या: seq [विकल्प] ... सबसे पहले पिछले
INCREMENT के चरणों में FIRST से LAST तक संख्याएँ प्रिंट करें।

  -f, --format = FORMAT प्रिंटफ स्टाइल फ्लोटिंग-पॉइंट FORMAT का उपयोग करें
  -s, --separator = STRING अलग संख्याओं के लिए STRING का उपयोग करें (डिफ़ॉल्ट: \ n)
  -w, - असमान-चौड़ाई अग्रणी शून्य के साथ पैडिंग द्वारा चौड़ाई को बराबर करती है
      -help इस मदद और प्रदर्शन से बाहर निकलें
      --version आउटपुट संस्करण की जानकारी और बाहर निकलें

अगर FIRST या INCREMENT को छोड़ दिया जाता है, तो यह 1 को चूक जाता है
जब LAST FIRST से छोटा होता है, तब भी 1 में चूक हो जाती है।
FIRST, INCREMENT और LAST की व्याख्या फ्लोटिंग पॉइंट वैल्यू के रूप में की जाती है।
यदि FIRST LAST से छोटा है, और INCREMENT आमतौर पर सकारात्मक है
यदि आमतौर पर FIRST LAST से अधिक है तो INCREMENT नकारात्मक है।
FORMAT को `डबल 'के एक तर्क को प्रिंट करने के लिए उपयुक्त होना चाहिए;
यह% .PRECf के लिए डिफ़ॉल्ट है अगर FIRST, INCREMENT और LAST सभी निश्चित बिंदु हैं
अधिकतम परिशुद्धता PREC के साथ दशमलव संख्या, और अन्यथा% g पर।

इसे भी देखें: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html


{1,50}या {01,50}(शून्य-गद्दी के लिए) बहुत आसान और अधिक समझने योग्य है।
केविन

1
सच ... यदि आप श के बजाय बैश का उपयोग कर रहे हैं। यही कारण है कि मैंने @ random832 का उत्तर दिया। यह एक अच्छा जवाब है। seq का उपयोग करना भी एक उपयोगी उत्तर है।
कैस

4

बस अलग होने के लिए, यहाँ एक पोसिक्स श समाधान है जो पुनरावृत्ति का उपयोग करता है:

makedirs() {
  [ "$1" -gt 0 ] || return
  mkdir "s$1"
  makedirs $(( $1 - 1 ))
}
$ makedirs 9
$ ls
s1  s2  s3  s4  s5  s6  s7  s8  s9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.