जवाबों:
ऐसा लगता है कि आप dirname का बेसनेम चाहते हैं :
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
कमांड इसे वर्तमान निर्देशिका (उर्फ "" ") में मान लेगा।
parentname="$(basename "$(dirname "$pwd")")"
PWD
इन्हें कैपिटल में लाना चाहिए। कोशिश करो parentname="$(basename "$(dirname "$PWD")")"
।
आप वर्तमान कार्य निर्देशिका को प्राप्त करने के लिए pwd का उपयोग कर सकते हैं, और इसे दूसरे (उप) शेल में स्थापित करने से बचने के लिए पैरामीटर विस्तार का उपयोग कर सकते हैं ।
echo ${PWD##*/}
संपादित करें: सिद्ध स्रोत
${path##*/}
मुझे लगता है कि यह एक कम संसाधन वाला समाधान है:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
संपादित करें: क्षमा करें, नेस्टेड विस्तार bash में संभव नहीं है, लेकिन यह zsh में काम करता है। बैश-संस्करण:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=file
या filepath = / file` के साथ आज़माएँ।
foofile
? यदि यह पूर्ण पथ नहीं है, तो पता नहीं चल सकता है (हो सकता है कि यदि foofile
कोई मौजूदा फ़ाइल न केवल "स्ट्रिंग" है)।
बैश में, एक पंक्ति में:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
मुझे जूलियन ६, का उत्तर सबसे अच्छा लगता है, लेकिन यहाँ एक विस्तारित संस्करण है:
file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;') # cut away "/a/b/c/"
echo $parent # --> you get "d"