का उपयोग करते हुए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
(पथ के साथ सही /
, केवल आधार नाम के साथ पथ , अनुगामी /
पथ, पथ के साथ और अनुगामी \n
s के बिना पथ )। यह कार्य सही नहीं हो सकता है यदि पथ में नई लाइनें हैं या वर्तमान लोकेल के लिए कुछ अमान्य वर्ण हैं। यह एकल के साथ /
( //
, ///
) के किसी भी संयोजन को भी बदलता है/
बदला गया लाइन mkdir "$1" || return 1
के लिए test -d "$1" || { mkdir "$1" || return 1; }
क्योंकि mkdir
त्रुटि के साथ समाप्त हो जाता है, तो पथ मौजूद है और इस चेक की तरह निर्माण युक्त रास्तों के लिए आवश्यक है aaa\.
(यदि aaa
पिछले संस्करण बनाता है मौजूद नहीं है aaa
और उसे फिर से बनाने की कोशिश करता है)।
Mkd का यह संस्करण एक त्रुटि उत्पन्न नहीं करता है यदि पथ पहले से मौजूद है (लेकिन यह अभी भी समानांतर निष्पादन में ऐसी त्रुटि उत्पन्न करने की संभावना है) और कमांड लाइन में कई निर्देशिकाएं प्राप्त नहीं कर सकता है।