कैसे बैश में dirname का अंतिम भाग प्राप्त करने के लिए


81

मान लीजिए कि मेरे पास एक फ़ाइल है /from/here/to/there.txt, और मैं इसके toबजाय इसके dirname का केवल अंतिम भाग प्राप्त करना चाहता /from/here/toहूं, मुझे क्या करना चाहिए?

जवाबों:


120

basenameभले ही यह फ़ाइल नहीं है, आप इसका उपयोग कर सकते हैं । फ़ाइल नाम का उपयोग करके स्ट्रिप करें dirname, फिर basenameस्ट्रिंग के अंतिम तत्व को प्राप्त करने के लिए उपयोग करें:

dir="/from/here/to/there.txt"
dir="$(dirname $dir)"   # Returns "/from/here/to"
dir="$(basename $dir)"  # Returns just "to"

2
कमांड '$ dir = "$ (dirname $ dir)" मेरे लिए काम नहीं करता है, लेकिन' dir = "$ (dirname $ dir)" ठीक काम करता है।
निकोलाई साइको

2
dirजब मैं इसे सेट कर रहा हूं तो मेरे सामने डॉलर नहीं होना चाहिए था ।
डेविड डब्ल्यू।



9

बैश पैरामीटर विस्तार का उपयोग करते हुए , आप ऐसा कर सकते हैं:

path="/from/here/to/there.txt"
dir="${path%/*}"       # sets dir      to '/from/here/to' (equivalent of dirname)
last_dir="${dir##*/}"  # sets last_dir to 'to' (equivalent of basename)

यह अधिक कुशल है क्योंकि कोई बाहरी कमांड का उपयोग नहीं किया जाता है।


मैंने अभी यह परीक्षण किया है। FreeBSD पर यहाँ मेरे परिणाम हैं: कोड: #! / Bin / sh cd / var / svn / repos path = "$ 1" इको "$ {पाथ}" dir = "$ {path% / *}" echo "$ {dir } "वास्तविक =" $ {dir ## * /} "गूंज" $ {वास्तविक} "----------------------------- ----------- परिणाम: $ .makerepo.sh / var / परीक्षण / var / परीक्षण / var var $ ------------------- ----------------- असफल! माफ़ करना। अच्छा तरीका बताया लेकिन सही जवाब नहीं।
रिचर्ड रॉबर्टसन

4

शुद्ध कैश तरीका:

s="/from/here/to/there.txt"
[[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}"
to

2
अगर फ़ाइल में कोई डॉट नहीं है तो काम नहीं करेगा .। निर्देशिका डॉट है तो काम नहीं करेगा .। इसे सरल रखें और स्लैम /को सीमांकक के रूप में उपयोग करें ।
alvits

1
बहुत बहुत धन्यवाद @ अक्षय
शुभ

3

awkइसे करने का एक तरीका होगा:

awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt"

स्पष्टीकरण:

  • -F'/' फ़ील्ड विभाजक को "/" के रूप में सेट करता है
  • दूसरा अंतिम फ़ील्ड प्रिंट करें $(NF-1)
  • <<<मानक इनपुट ( विकी स्पष्टीकरण ) के रूप में इसके बाद कुछ भी उपयोग करता है


1

यह प्रश्न कुछ इस तरह है ।

हल करने के लिए जो आप कर सकते हैं:

DirPath="/from/here/to/there.txt"
DirPath="$(dirname $DirPath)"
DirPath="$(basename $DirPath)"

echo "$DirPath"

जैसा कि मेरे दोस्त ने कहा कि यह संभव है:

basename `dirname "/from/here/to/there.txt"`

अपने पथ के किसी भी भाग को प्राप्त करने के लिए:

echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }'
OR
echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }'
OR
etc

1

पूछे गए प्रश्न के लिए शीर्ष उत्तर बिल्कुल सही है। लंबे पथ के बीच में आवश्यक निर्देशिका के साथ अधिक सामान्य मामले में, यह दृष्टिकोण कोड को पढ़ने के लिए एक कठिन होता है। उदाहरण के लिए :

dir="/very/long/path/where/THIS/needs/to/be/extracted/text.txt"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(basename $dir)"

इस मामले में एक का उपयोग कर सकते हैं:

IFS=/; set -- "/very/long/path/where/THIS/needs/to/be/extracted/text.txt"; set $1; echo $6
THIS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.