वहाँ mkdir के साथ एक ही बार में कई निर्देशिकाएँ बनाने का एक तरीका है?


112

अगर मैं (एक ही स्तर पर) कई निर्देशिका बनाना चाहता था और फिर इसे निर्देशिका नामों (या उस प्रभाव के लिए कुछ) की अल्पविराम से अलग सूची खिलाएं?



5
किसी भी समय आप यह जानना चाहते हैं कि क्या कोई कमांड आपके manद्वारा किया गया कुछ काम कर सकता है, कमांड के नाम के बाद टाइप करें।
डेविड रिचर्बी

@DavidRicherby हालांकि man mkdir"तरह का" एक साथ कई निर्देशिका बनाने की संभावना का सुझाव देता है, यह विशेष रूप से उल्लेख नहीं किया गया है, न ही ऐसा कैसे करें।
जैकब व्लिजम

2
@JacobVlijm GNU कोरूटिल्स 8.21 मैनकॉर्ड के लिए mkdir का कहना है, " NAME mkdir - निर्देशिका बनाएं // SYNOPSIS mkdir [विकल्प] ... [DIRECTORY] ... - वर्णन (यदि वे पहले से ही मौजूद नहीं हैं तो विवरण बनाएं)।" यह बहुत स्पष्ट लगता है कि आप एक से अधिक निर्देशिका बना सकते हैं।
डेविड रिचेर्बी

9
@JacobVlijm मैन पेज शब्दजाल निर्देश के बिना स्पष्ट नहीं है, लेकिन मैन पेजों की तकनीकी भाषा में, दी गई बोली में भी जानकारी पूरी तरह से स्पष्ट है। नोट के ...बाद [DIRECTORY], जिसका अर्थ है कि तर्क दोहराया जा सकता है। तो DIRECTORY(ies)सभी पारित DIRECTORYतर्कों को संदर्भित करता है । हालांकि, "आरटीएफएम" टिप्पणियां कभी-कभी भूल जाती हैं कि सीखने के लिए एक संकेतन है।
ब्लेज़ोरब्लेड

जवाबों:



152

निर्देशिका बनाने के लिए आप सूचियों का उपयोग कर सकते हैं और यह बहुत जंगली हो सकता है।

लोगों को इसके बारे में सोचने के लिए कुछ उदाहरण:

mkdir sa{1..50}
mkdir -p sa{1..50}/sax{1..50}
mkdir {a-z}12345 
mkdir {1,2,3}
mkdir test{01..10}
mkdir -p `date '+%y%m%d'`/{1,2,3} 
mkdir -p $USER/{1,2,3} 
  1. Sa1 से 50 निर्देशिकाएं sa50 के माध्यम से
  2. वही लेकिन निर्देशिका में से प्रत्येक sax50 के माध्यम से 50 गुना sax1 रखेगा (-p मौजूद नहीं होने पर मूल निर्देशिका बनाएगा।
  3. A12345 से 26 निर्देशिका z12345 के माध्यम से
  4. अल्पविराम से अलग सूची 1, 2 और 3 बनाता है।
  5. से 10 निर्देशिका test01के माध्यम से test10
  6. 4 के समान लेकिन एक निर्देशिका के रूप में वर्तमान तिथि और इसमें 1,2,3 के साथ।
  7. 4 के समान लेकिन वर्तमान उपयोगकर्ता के लिए एक निर्देशिका के रूप में और इसमें 1,2,3।

इसलिए, अगर मैंने इसे सही ढंग से समझा और आप कुछ निर्देशिका बनाना चाहते हैं, और उनके भीतर नई निर्देशिकाएँ हैं, तो आप ऐसा कर सकते हैं:

mkdir -p sa{1..10}/{1,2,3}

और sa1, sa2, ..., sa10 और प्रत्येक dirs 1, 2 और 3 के भीतर प्राप्त करें।


मैं @ gniourf_gniourf से सहमत हूं ... आपके उत्तर में नियमित अभिव्यक्तियों का कोई उपयोग नहीं है। क्या आपका मतलब कुछ और कहना है, या एक अलग उदाहरण प्रदान करना है?
स्लिप डी। थॉम्पसन

1
@gniourf_gniourf किया :)
Rinzwind

3
यह ध्यान देने योग्य है कि POSIX शेल में परिभाषित नहीं ब्रेस विस्तार: pubs.opengroup.org/onlinepubs/9699919799/utilities/… उदाहरण के लिए यह काम नहीं करेगा dashजिसमें /bin/shउबंटू पर डिफ़ॉल्ट है।
पाबौक

7
यह उत्तर उस इनपुट को mddir के तर्कों के रूप में प्रदान करने से पहले आपके इनपुट के विस्तार पर निर्भर करता है । यह कहना अधिक सटीक है कि mkdir कई तर्कों के साथ कई डायर बना सकता है और फिर इस बारे में बात कर सकता है कि एक दिया गया शेल कितना आसान बना सकता है।
deed02392

अगर मैं ऐसा कुछ करने की कोशिश करता हूं mkdir sa$(seq 0.1 0.1 1), तो यह सब एक निर्देशिका बनाता है जिसका नाम sa0.1 है और बाकी 0.2, 0.3, ..., 1. मैं पूरी सूची लिखे बिना दशमलव ब्रेस विस्तार कैसे प्राप्त कर सकता हूं?
कुर्सी

26

यह बहुत सरल है, आपको एक निर्देशिका संरचना बनाना चाहते हैं जैसे:

Websites/
  static/
      cs
      js
  templates/
      html

आप इसे इस तरह से एक ही कमांड में कर सकते हैं:

mkdir -p Website/{static/{cs,js},templates/html}

किसी भी स्थान में प्रवेश न करने के लिए सावधान रहें


कमांड चलाने से पहले उन्हें विस्तारित करने के लिए आप यहां टैब भी दबा सकते हैं।
आइजैक ग्रेगसन

14

एक विभाजक के रूप में अल्पविराम के बजाय लाइन ब्रेक का उपयोग करके अपने वांछित निर्देशिकाओं के नामों की सूची बनाएं। उस सूची को सहेजें।

mkdir `cat list`

अब आपके पास अपनी सूची में नामित सभी निर्देशिकाएं होनी चाहिए।


1
हां, यह काम करेगा, हालांकि, एक चेतावनी के साथ - निर्देशिका नाम एक पूरे स्ट्रिंग होना चाहिए। यदि एक रेखा है spaced dir, तो यह दो dirs, spacedऔर `dir बनाएगी ।
सर्गी कोलोडियाज़नी

हाँ - आप भी सफलतापूर्वक रिक्त स्थान के लिए भागने के किसी भी प्रकार नहीं कर सकते हैं, या तो - junk\ dirमें listफ़ाइल दो निर्देशिका देता है, junk\ और dir। जब मैंने \ डायरेक्टरी नाम में ए देखा तो मुझे घबराहट हुई ।
जॉन वी।

इसे -pअन्य उत्तरों में उल्लिखित ध्वज के साथ जोड़ा जा सकता है। यदि ऐसा है, तो listफ़ाइल को मूल निर्देशिकाओं को अपनी पंक्तियों के रूप में शामिल करने की आवश्यकता नहीं है, उन्हें स्वचालित रूप से पता लगाया जाएगा और बनाया जाएगा।
mcw0933

8

कुछ इस तरह? ( printfटिप के लिए मुरु का धन्यवाद )

printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
$ printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
bar  baz  foo
$ 

आप इसे उपयोग में आसानी के लिए एक फ़ंक्शन में लपेट सकते हैं:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 

1
बस printf "%s" "$1" | xargs -d, mkdirपर्याप्त होना चाहिए।
मूरू

7

तो क्या आप चाहते हैं अल्पविराम से अलग निर्देशिका नामों की सूची? वह किया जा सकता है।

शैल + कोरुटिल्स

चूँकि हर कोई oneliners पोस्ट कर रहा है, यहाँ मेरा भी है (mkdir + पैरामीटर प्रतिस्थापन प्लस + ​​शेल पुनर्निर्देशन)।

DIR:/testdir
skolodya@ubuntu:$ ls

DIR:/testdir
skolodya@ubuntu:$ mkdir $( tr '[,\n]' ' '   < /home/xieerqi/dirList.txt   )                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

AWK

AWK एक टेक्स्ट प्रोसेसिंग लैंग्वेज है, लेकिन इसमें बहुत अच्छा system()फंक्शन है, जो डिफॉल्ट शेल को कॉल करेगा, और कोष्ठक में संलग्न कमांड [s] रन करेगा (जो एक स्ट्रिंग होना चाहिए)।

DIR:/xieerqi
skolodya@ubuntu:$ awk -F ',' '{for(i=1;i<=NF;i++) system("mkdir "$i)}' dirList.txt                                    

DIR:/xieerqi
skolodya@ubuntu:$ ls -ld dir*                                                                                         
-rw-rw-r-- 1 xieerqi xieerqi   23 Feb  9 11:41 dirList.txt
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirone/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirthree/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirtwo/

DIR:/xieerqi
skolodya@ubuntu:$ cat dirList.txt                                                                                     
dirone,dirtwo,dirthree

या आप फ़ंक्शन के ,साथ निकाल सकते हैं gsub(), और कॉल system("mkdir "$0)कर सकते हैं लेकिन यह एक समस्या हो सकती है यदि आप उनके नाम से रिक्त स्थान के साथ निर्देशिका बनाना चाहते हैं

अजगर

एक ही करने का पाइथोनिक तरीका, प्रत्येक पंक्ति को पढ़ना, अनुगामी से छुटकारा पाना \n, एक सूची में सब कुछ छोड़ना और सूची आइटम पर पुनरावृति करना और प्रति सूची आइटम के लिए डायर बनाना होगा। ध्यान दें कि उदाहरण bellow में, /home/xieerqi/dirList.txtमेरी फ़ाइल को दिया गया पूर्ण पथ है, और हम स्ट्रिंग से जुड़कर प्रत्येक नई निर्देशिका का पूर्ण पथ बनाते /home/username/हैं और सूची से पढ़ा गया dir नाम। आवश्यक के रूप में अपने स्वयं के मूल्यों को प्रतिस्थापित करें

DIR:/testdir
skolodya@ubuntu:$ ls                                                                                                  

DIR:/testdir
skolodya@ubuntu:$ /home/xieerqi/makeDirs.py                                                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

DIR:/testdir
skolodya@ubuntu:$ cat /home/xieerqi/makeDirs.py
#!/usr/bin/env python
import os
with open("/home/xieerqi/dirList.txt") as file:
   for line in file:
         for directory in line.strip().rsplit(','):
             path = '/home/xieerqi/testdir/' +  directory
             os.makedirs(path)

3
मुझे नहीं लगता कि पूछने वाला वास्तव में सूची को अल्पविराम से अलग करना चाहता है; मुझे पूरा यकीन है कि सिंटैक्स क्या हो सकता है यह सिर्फ उनका अनुमान था।
डेविड रिचेर्बी

ठीक है, ओपी ने शायद अल्पविराम से अलग की गई सूची नहीं बनाई है, हालांकि यह सुनिश्चित है कि इसका इस्तेमाल एक विधि के रूप में किया जा सकता है, बिंदु "सूचियों का उपयोग किया जा सकता है, आपको व्यक्तिगत रूप से प्रत्येक डायर का नाम टाइप करने की आवश्यकता नहीं है"। विशेष रूप से तब उपयोगी होगा जब एक बड़ी सूची को श्रेणियों के साथ उत्पन्न नहीं किया जा सकता है, जैसे dir{1..1000}। कहो, आप एक उपयोगकर्ता नाम, या परियोजना के अनुसार, या भौगोलिक स्थिति के अनुसार, एक शहर की तरह एक निर्देशिका बनाना चाहते हैं
सर्गी कोलोडियाज़नी

1

mkdir कमांड कई तर्क देता है जो नीचे दिए अनुसार चलते हैं

mkdir dir1 dir2 dir3 ... dirN

यदि आप एक से अधिक उपनिर्देशिकाएँ बनाना चाहते हैं तो आप नीचे दिए गए {} में दिए गए उन तर्कों को पास कर सकते हैं (रिक्त स्थान को बिना तर्क के अलग करने के लिए केवल अल्पविराम का उपयोग करें)।

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.