फ़ाइल के लिए मूल निर्देशिका प्राप्त करें


24

मैं फ़ाइल के लिए मूल निर्देशिका का नाम प्राप्त करना चाहता हूं।

उदाहरण: जब मेरे पास है path=/a/b/c/d/file, तो मुझे आउटपुट के रूप में केवल dऔर नहीं /a/b/c/d(जो मुझे मिलता है dirname $path) चाहिए।

क्या ऐसा करने का कोई परिष्कृत तरीका है?

जवाबों:


26

ऐसा लगता है कि आप dirname का बेसनेम चाहते हैं :

$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d

मैं क्यों प्राप्त कर रहा हूँ डेबियन पर मूल निर्देशिका के बजाय?
आमिर

@Amir: आप एक पूर्ण पथ, या सिर्फ एक फ़ाइल नाम के साथ शुरू कर रहे हैं? यदि यह केवल एक फ़ाइल नाम है, तो dirnameकमांड इसे वर्तमान निर्देशिका (उर्फ "" ") में मान लेगा।
गॉर्डन डेविसन

ठीक है, मैं इस का उपयोग कर रहा हूँ:parentname="$(basename "$(dirname "$pwd")")"
अमीर

1
@Amir: शेल वैरिएबल केस संवेदी होते हैं, और PWDइन्हें कैपिटल में लाना चाहिए। कोशिश करो parentname="$(basename "$(dirname "$PWD")")"
गॉर्डन डेविसन

5

आप वर्तमान कार्य निर्देशिका को प्राप्त करने के लिए pwd का उपयोग कर सकते हैं, और इसे दूसरे (उप) शेल में स्थापित करने से बचने के लिए पैरामीटर विस्तार का उपयोग कर सकते हैं ।

echo ${PWD##*/}

संपादित करें: सिद्ध स्रोत


सवाल का मौजूदा निर्देशिका से कोई लेना-देना नहीं है। आप उपयोग कर सकते हैं${path##*/}
Matteo

2

मुझे लगता है कि यह एक कम संसाधन वाला समाधान है:

 $ 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कोई मौजूदा फ़ाइल न केवल "स्ट्रिंग" है)।
uzsolt

1

बैश में, एक पंक्ति में:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'

2
क्या आप इसमें शामिल प्रक्रियाओं को विस्तृत कर सकते हैं? यह भविष्य के पाठकों के लिए मददगार हो सकता है। इसके अलावा, कृपया 1/2 पंक्ति के उत्तर न लिखने का प्रयास करें।
लोरेंजो वॉन मैटरहॉर्न

0

मुझे जूलियन ६, का उत्तर सबसे अच्छा लगता है, लेकिन यहाँ एक विस्तारित संस्करण है:

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