पुनरावर्ती mkdir


305

वहाँ एक Linux कमांड है जिसे मैं देख रहा हूँ जो कि: (छद्म) की तर्ज पर कुछ करना संभव बनाता है

$ mkdir -R foo/bar/zoo/andsoforth

या फिर निर्देशिकाओं को एक बार में बनाने के अलावा कोई विकल्प नहीं है?



1
मजाकिया, मैं उस पृष्ठ को देख रहा था, लेकिन "माता-पिता" को पूरी तरह से अनदेखा कर रहा था क्योंकि मैं उन्हें बच्चों के रूप में सोच रहा था (बाएं से दाएं)।

18
Protip: कुछ गोले में आप भी कर सकते हैं mkdir -p foo/{bar,baz}/zoo/andsoforth। बहुत उपयोगी!
एरोन कोपले

1
व्यक्तिगत रूप से, मैंने मैन पेज में "माता-पिता" की अनदेखी की, क्योंकि, मुझे लगता है कि झंडा "पुनरावर्ती" के लिए "-r" होना चाहिए - या बहुत कम से कम, ऐसे के लिए एक उपनाम होना चाहिए क्योंकि mkdirकेवल 6 है कुल में झंडे प्रलेखित। नरक, मुझे लगता है कि कमांड को डिफ़ॉल्ट रूप से निर्देशिकाओं का पुन: निर्माण करना चाहिए, और यदि आप ऐसा नहीं चाहते हैं तो आपको स्पष्ट रूप से निर्दिष्ट करना चाहिए।
जूलमैन

जवाबों:


511
$ mkdir -p foo/bar/zoo/andsoforth

92
FYI -p का अर्थ "माता-पिता" है
carl crott

14
वे किसी भी अन्य कमांड की तरह, आर-आर बना सकते थे, जो कि हर लिनक्स कमांड के लिए विशिष्ट मापदंडों को याद रखना असंभव है
वेदांत

2
लेकिन mkdir -pपार मंच नहीं है, हर शेल में काम नहीं करता है
Роман Коптев

9
@ РоманКоптев, mkdir -pहै POSIX में निर्दिष्ट है, जो पूरी तरह से पोर्टेबल होने के निकटतम बात है। शेल स्क्रिप्ट में आप क्या बेहतर करते हैं?
वाइल्डकार्ड

5
@StephanBijzitter हां, यह unix.se है, unixandwindows.se नहीं है। :)
EEAA

16

का उपयोग करते हुएmkdir -p सबसे आधुनिक OSes के लिए एक आसान तरीका है:

mkdir -p foo/bar/zoo/andsoforth

हालांकि, mkdir -pकई मैनुअल में अनुशंसित नहीं है। GNU के लिए प्रलेखन पढ़ें makeऔर autoconfउपयोग करने के साथ समस्याओं के बारे में mkdir -p:

क्रॉस प्लेटफ़ॉर्म इंस्टॉलेशन और कॉन्फ़िगरेशन सिस्टम के लिए अपने स्वयं के सुरक्षित विकल्प हैंmkdir -p

शेल कमांड लाइन में उपयोग करने के लिए सीएमके:

 cmake -E make_directory foo/bar/zoo/andsoforth

प्रीप्रोसेसिंग के साथ स्क्रिप्ट में उपयोग करने के लिए ऑटोकॉन्फ़:

AS_MKDIR_P(foo/bar/zoo/andsoforth)

या:

AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)

लेकिन इन समाधानों की आवश्यकता होती है cmakeया autoconf( M4) उपकरण स्थापित करने के लिए (और संभव प्रीप्रोसेसिंग)

आप विकल्प के install-shसाथ स्क्रिप्ट का उपयोग भी कर सकते हैं -d:

install-sh -d foo/bar/zoo/andsoforth

यह स्क्रिप्ट द्वारा किया जाता है autoconfऔर automakeइस परियोजना। मुझे लगता है कि यह सबसे सुरक्षित उपाय होना चाहिए।

जिस समय मैं /bin/shबिना किसी निर्भरता के मानक के लिए एक क्रॉस प्लेटफॉर्म समाधान खोज रहा था , लेकिन एक नहीं मिला। इसलिए मैंने अगली स्क्रिप्ट लिखी जो आदर्श नहीं हो सकती है, लेकिन मुझे लगता है कि यह अधिकांश क्रॉस प्लेटफॉर्म आवश्यकताओं के अनुरूप है :

#! /bin/sh

cdirname() # cross platform alternative for 'dirname'
{
  # $1 - path
  test $# -eq 1 || { echo "Procedure 'cdirname' must have only one parameter. Scripting error."; exit 1; }
  echo "$1" | sed -n -e '1p' | sed  -e 's#//*#/#g' -e 's#\(.\)/$#\1#' -e 's#^[^/]*$#.#' -e 's#\(.\)/[^/]*$#\1#' -
}

mkd() # cross platform alternative for 'mkdir -p'
{
  # $1 - directory to create
  test $# -eq 1 || { echo "Function 'mkd' can create only one directory (with it's parent directories)."; exit 1; }
  test -d "$1"  && return 0
  test -d "$(cdirname "$1")" || { mkd "$(cdirname "$1")" || return 1; }
  test -d "$1" || { mkdir "$1" || return 1; }
  return 0
}

यह स्क्रिप्ट वर्ष प्रणाली, जहां विकल्प के लिए इस्तेमाल किया जा सकता -pके लिए mkdirअनुपस्थित है।

sed-बेड क्रॉस प्लेटफॉर्म संस्करण dirnameको कोड में जोड़ा गया था। यह समान तरीके से काम करता है dirname(पथ के साथ सही /, केवल आधार नाम के साथ पथ , अनुगामी /पथ, पथ के साथ और अनुगामी \ns के बिना पथ )। यह कार्य सही नहीं हो सकता है यदि पथ में नई लाइनें हैं या वर्तमान लोकेल के लिए कुछ अमान्य वर्ण हैं। यह एकल के साथ /( //, ///) के किसी भी संयोजन को भी बदलता है/

बदला गया लाइन mkdir "$1" || return 1के लिए test -d "$1" || { mkdir "$1" || return 1; }क्योंकि mkdirत्रुटि के साथ समाप्त हो जाता है, तो पथ मौजूद है और इस चेक की तरह निर्माण युक्त रास्तों के लिए आवश्यक है aaa\.(यदि aaaपिछले संस्करण बनाता है मौजूद नहीं है aaaऔर उसे फिर से बनाने की कोशिश करता है)।

Mkd का यह संस्करण एक त्रुटि उत्पन्न नहीं करता है यदि पथ पहले से मौजूद है (लेकिन यह अभी भी समानांतर निष्पादन में ऐसी त्रुटि उत्पन्न करने की संभावना है) और कमांड लाइन में कई निर्देशिकाएं प्राप्त नहीं कर सकता है।


4
"mkdir -p" को पॉज़िक्स द्वारा परिभाषित किया गया है। यूनिक्स या यूनिक्स जैसे वेरिएंट इसका समर्थन नहीं करते हैं? (और यह एक शेल निर्मित नहीं होना चाहिए, हालांकि मुझे लगता है कि कोई कारण नहीं है कि यह नहीं हो सकता है।) pubs.opengroup.org/onlinepubs/9699919799/utilities/mkdir.html
टिम बी

5
उस पृष्ठ की कुछ जानकारी केवल 15 साल पुरानी है। कुछ पुराना है।
थॉमस डिकी

7
सिस्टम जो समर्थन नहीं mkdir -pकरेगा वह बहुत पुराना होगा (और हम कम से कम कुछ दशक पुराने बात कर रहे हैं) विकल्प के अंत को चिह्नित करने के लिए एक printfउपयोगिता या समर्थन --है।
स्टीफन चेज़लस

2
आपका वर्तमान स्थान में newline वर्ण, या अमान्य वर्ण वाले निर्देशिका नामों के cdirnameलिए गलत उत्तर देगा foo/bar//
स्टीफन चेजेलस

2
printfPOSIX सिस्टम पर सुरक्षित है। POSIX सिस्टम समर्थन करते हैं mkdir -pmkdir -pदशकों से POSIX द्वारा निर्दिष्ट किया गया है। --80 के दशक के मध्य में SysIII के साथ शुरू होने वाले एटी एंड टी सिस्टम पर व्यापक रूप से शुरू किया गया। printfपहली बार एक kshबिलियन के रूप में दिखाई दिया जो मुझे विश्वास है और बाद में पोसिक्स द्वारा निर्दिष्ट किया गया था mkdir -p। कुछ POSIX गोले (जैसे pdksh या यश आधारित) अभी भी बिलिन नहीं है printf
स्टीफन चेज़लस

0

-pकमांड इन ऑप्शन p arent डायरेक्ट्रीज़ को आवश्यकतानुसार mkdirबनाता है (यदि कोई त्रुटि नहीं है तो मौजूदा):

mkdir -p foo/bar/zoo/andsoforth

एक और तरीका है, उदाहरण के लिए &&(त्रुटि यदि निर्दिष्ट फ़ोल्डर मौजूद है)

mkdir foo && mkdir foo/bar && mkdir foo/bar/zoo && mkdir foo/bar/zoo/andsoforth

चेनिंग ऑपरेटर &&का उपयोग कमांड को एक साथ चेन करने के लिए किया जाता है, जैसे कि अगला कमांड तभी चलाया जाता है यदि और केवल तभी होता है जब पूर्ववर्ती कमांड बिना त्रुटियों के बाहर निकल जाती है।

बेशक, पहला तरीका बेहतर है।


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