का उपयोग करते हुए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 का यह संस्करण एक त्रुटि उत्पन्न नहीं करता है यदि पथ पहले से मौजूद है (लेकिन यह अभी भी समानांतर निष्पादन में ऐसी त्रुटि उत्पन्न करने की संभावना है) और कमांड लाइन में कई निर्देशिकाएं प्राप्त नहीं कर सकता है।