अगर केवल एक डायर पहले से ही मौजूद नहीं है तो mkdir कैसे?


1986

मैं AIX पर KornShell (ksh) के तहत चलने के लिए एक शेल स्क्रिप्ट लिख रहा हूं। मैं mkdirनिर्देशिका बनाने के लिए कमांड का उपयोग करना चाहूंगा । लेकिन निर्देशिका पहले से मौजूद हो सकती है, जिस स्थिति में मैं कुछ भी नहीं करना चाहता हूं। इसलिए मैं या तो यह देखने के लिए परीक्षण करना चाहता हूं कि निर्देशिका मौजूद नहीं है, या "फ़ाइल मौजूद है" त्रुटि को mkdirदबाएं जो मौजूदा निर्देशिका बनाने की कोशिश करने पर फेंकता है।

यह कैसे करना है पर कोई विचार?

जवाबों:


3292

कोशिश करें mkdir -p:

mkdir -p foo

ध्यान दें कि यह कोई भी मध्यवर्ती निर्देशिका भी बनाएगा जो मौजूद नहीं है; उदाहरण के लिए,

mkdir -p foo/bar/baz

निर्देशिका का निर्माण करेगा foo, foo/barऔर foo/bar/bazअगर वे मौजूद नहीं हैं।

GNU जैसे कुछ कार्यान्वयन mkdirमें mkdir --parentsअधिक पठनीय उपनाम के रूप में शामिल हैं , लेकिन यह POSIX / Single Unix Specification में निर्दिष्ट नहीं है और MacOS, विभिन्न BSD और विभिन्न वाणिज्यिक यूनिक्स जैसे कई सामान्य प्लेटफार्मों पर उपलब्ध नहीं है, इसलिए इसे टाला जाना चाहिए।

यदि आप कोई त्रुटि चाहते हैं जब मूल निर्देशिका मौजूद नहीं है, और निर्देशिका बनाना चाहते हैं यदि यह मौजूद नहीं है, तो आप testनिर्देशिका के अस्तित्व के लिए कर सकते हैं :

[ -d foo ] || mkdir foo

11
छोटा उदाहरण जो आप उपयोग करते हैं वह वही है जो आपको नहीं करना चाहिए। यह कोडिंग स्थान को बचाने के लिए तर्क को उलट रहा है लेकिन इसका उपयोग करना चाहिए! और && और इसे पढ़ने वालों के लिए अधिक समझ में आता है।
माइक क्यू

16
@AndreasLarsen यह सवाल mkdirयूनिक्स जैसे सिस्टम पर है, विंडोज पर नहीं। -pPOSIX / एकल यूनिक्स विनिर्देश अनुपालन के लिए आवश्यक है, इसलिए कुछ भी जो उन विशिष्टताओं का अनुपालन करने का इरादा रखता है -p। जब तक आप Cygwin या MSYS जैसी POSIX इम्यूलेशन लेयर का उपयोग नहीं करते, तब तक Windows पूरी तरह से अलग है।
ब्रायन कैंपबेल

22
मैंने आज कुछ दिलचस्प खोज की mkdir -p, आप कोष्ठक का उपयोग कर सकते हैं! {}एक कमांड में "जटिल" निर्देशिका ट्री बनाने के लिए। यहाँ देखें: technosophos.com/2010/04/15/...
Herve

12
@MikeQ I की ||बजाय पसंद करते हैं &&क्योंकि तब पूरी लाइन को सही निकास स्थिति मिलती है । महत्वपूर्ण है अगर आपका शेल साथ चलता है errexitया यदि वह लाइन किसी फ़ंक्शन, स्विच-केस, जो भी हो, में अंतिम है।
रुडाइमियर

9
@herve जिसका कोई लेना देना नहीं है mkdir; शेल इस तरह की अभिव्यक्ति को तर्क की एक असतत सूची में विस्तारित करता है जिसे पारित किया जाता है mkdir
chepner

176

यह काम करना चाहिए:

$ mkdir -p dir

या:

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

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


मुझे नहीं लगता कि कोर्न में एक डी ऑपरेटर है, बल्कि-इसका उपयोग दोनों फाइलों / निर्देशिकाओं के लिए किया जाता है और सिर्फ अस्तित्व की जांच करता है। इसके अलावा, वे सभी 0 सफलता पर लौटते हैं, इसलिए! बेमानी है। यदि मैं गलत हूं तो मुझे सही करों।
अलकर

1
दोनों मामलों में गलत, AFAIK। परीक्षण सफलता पर सच है, और -d भी मौजूद है (कम से कम मैकओएस एक्स पर)
अलनीतक

5
यह उल्लेखनीय है कि यह थ्रेड-सेफ नहीं है। उस समय के बीच जब आप जाँचते हैं कि निर्देशिका मौजूद है और जिस समय आप लिखने का प्रयास करते हैं, चीजें बदल सकती हैं।
जस्टिन एल।


73

एक कमांड के साथ जटिल निर्देशिका पेड़ों को परिभाषित करना

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

कोई त्रुटि है, तो के रूप में मौजूदा, मेकअप माता पिता निर्देशिका की जरूरत
Fedir RYKHTIK

18
ध्यान रखें कि यह mkdirस्वयं की विशेषता नहीं है, लेकिन शेल जो कमांड निष्पादित करता है। इसे ब्रेस विस्तार कहा जाता है - AFAIK, केवल बैश, ksh, zsh, और C शेल इसका समर्थन करते हैं।
डैनियल कामिल कोजार

3
यदि आपके पास अल्पविराम के चारों ओर रिक्त स्थान हैं (तो) अप्रत्याशित परिणाम प्राप्त कर सकते हैं। खबरदार।
एटलस 7

1
@ एटलस 7 ने कहा, आपको उन पात्रों से बचना होगा जो सामान्य रूप से रेगेक्स का हिस्सा हैं। (यानी इसके बजाय folder nameआपको उपयोग करने की आवश्यकता है folder\ name)
जॉन हैमिल्टन

1
यह कोई उत्तर नहीं है; यह एक अलग विषय है जो एक टिप्पणी के रूप में अधिक उपयुक्त होगा।
क्रिस पेज

40

यदि आप कोई त्रुटि संदेश नहीं दिखाना चाहते हैं:

[ -d newdir ] || mkdir newdir

यदि आप अपना स्वयं का त्रुटि संदेश दिखाना चाहते हैं:

[ -d newdir ] && echo "Directory Exists" || mkdir newdir

20

पुरानी कोशिश की और सच है

mkdir /tmp/qq >/dev/null 2>&1

अन्य कई समाधानों में से कोई भी शर्त शर्तों के साथ आप जो चाहते हैं वह करेंगे।

कभी-कभी सबसे सरल (और बदसूरत) समाधान सबसे अच्छा होता है।


5
यह विफल हो जाएगा यदि "tmp" मौजूद नहीं था। न ही यह आपको कोई पुष्टि देता है।
माइक क्यू

15

mkdir fooभले ही निर्देशिका मौजूद है। इसे केवल तभी काम करने के लिए जब "फू" नाम की निर्देशिका मौजूद नहीं है, -pध्वज का उपयोग करने का प्रयास करें ।

उदाहरण :-

mkdir -p foo

यह "फू" नाम की निर्देशिका तभी बनाएगा जब वह मौजूद नहीं होगी। :)


2
जैसा कि @BrianCampbell ने उल्लेख किया है, यह मार्ग में कोई अन्य निर्देशिका भी बनाएगा। यह खतरनाक हो सकता है यदि उदाहरण के लिए वॉल्यूम अनमाउंट हो जाता है, क्योंकि यह माउंट पॉइंट में डायरेक्टरी बना सकता है।
ulvitness


10

या यदि आप पहले अस्तित्व की जाँच करना चाहते हैं:

if [[ ! -e /path/to/newdir ]]; then
            mkdir /path/to/newdir
fi

-e कॉर्न खोल के लिए अस्तित्व परीक्षण है।

तुम भी एक गोले खोल मैनुअल googling की कोशिश कर सकते हैं।


10

mkdir विंडोज 8+ सिस्टम पर अब -p स्विच का समर्थन नहीं करता है।

आप इसका उपयोग कर सकते हैं:

IF NOT EXIST dir_name MKDIR dir_name

10
ओपी AIX kornshell के बारे में था ... विंडोज के साथ कुछ नहीं करना है, यह करता है?
जे। चोमेल

9

man mkdirविकल्प के लिए मैन पेज का जिक्र -p

   -p, --parents
          no error if existing, make parent directories as needed

जो किसी दिए गए पथ में सभी निर्देशिकाओं को बनाएगा, यदि कोई त्रुटि नहीं है, तो अन्यथा यह दिए गए पथ में बाएं से दाएं सभी निर्देशिकाएं बनाता है। नीचे दिए गए आदेश का प्रयास करें। इस आदेश को जारी करने से पहले निर्देशिका newdirऔर anotherdirमौजूद नहीं है

सही उपयोग

mkdir -p /tmp/newdir/anotherdir

कमांड निष्पादित करने के बाद आप / tmp के नीचे देख newdirऔर बना सकते हैं anotherdir। आप इस कमांड को जितनी बार चाहें उतनी बार जारी कर सकते हैं exit(0)। इस कारण के कारण अधिकांश लोग उन वास्तविक रास्तों का उपयोग करने से पहले शेल स्क्रिप्ट में इस कमांड का उपयोग करते हैं।


8

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

1) dir = / home / dir_name

if [ ! -d $dir ]
then
     mkdir $dir
else
     echo "Directory exists"  
fi

2) आप निर्देशिका बनाने के लिए -p विकल्प के साथ mkdir का उपयोग कर सकते हैं। यह जाँच करेगा कि निर्देशिका उपलब्ध नहीं है या नहीं।

mkdir -p $dir

mkdir -p निर्देशिका की ट्री संरचना बनाने की अनुमति देता है। यदि आप एक ही कमांड का उपयोग करके माता-पिता और बच्चे की निर्देशिका बनाना चाहते हैं, तो mkdir -p चुन सकते हैं

mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2

अगर लूप का उपयोग करने में कोई फायदा है !? क्यों किसी को उस ओवर-पी विकल्प का चयन होगा ?!
पेड्रम बशीरी

1
मैंने आपको फ़ोल्डर बनाने के तरीके साझा किए हैं जब कोई फ़ोल्डर मौजूद नहीं है। यह एक पर आवश्यकता पर निर्भर करता है। यदि आपके पास एक उपयोग का मामला है जहां आपको यह जांचने की आवश्यकता है कि क्या फ़ोल्डर मौजूद नहीं है और आप उस पर नज़र रखना चाहते हैं, तो आप समाधान 1 के साथ जा सकते हैं। यदि यह कोई फर्क नहीं पड़ता है, तो आप समाधान 2 के साथ जा सकते हैं, यह फ़ोल्डर बना देगा अगर मौजूद नहीं है।
अभिनवविद्या aid

मैंने एक लूप नहीं देखा।
अमित नायडू

3

यह एक साधारण फ़ंक्शन (बैश शेल) है जो आपको एक निर्देशिका बनाने देता है यदि यह मौजूद नहीं है।

#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
    if [ ! -d $1 ]
        then
        mkdir -p $1
    fi
}

आप उपरोक्त फ़ंक्शन को इस रूप में कह सकते हैं:

createDirectory / tmp / fooDir / बारडीर

ऊपर fooDir और BarDir बनाता है अगर वे मौजूद नहीं हैं। Mkdir कमांड में "-p" विकल्प पर ध्यान दें जो निर्देशिकाओं को पुनरावर्ती बनाता है। उम्मीद है की यह मदद करेगा।


2
mkdir -p sam
  • mkdir = निर्देशिका बनाएँ
  • -प = - अपरेंट
  • (कोई त्रुटि नहीं अगर मौजूदा है, तो माता-पिता निर्देशिका को आवश्यकतानुसार बनाएं)

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