2014-04-18 6 views
41

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

उत्तर

12

dirname के विपरीत basename है:

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

शुद्ध मार रास्ता:

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

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

+0

अब सही किया गया ... – anubhava

+1

धन्यवाद बहुत धन्यवाद @ अक्षय – anubhava

57

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

$ s="/from/here/to/there.txt" 
$ s="${s%/*}" && echo "${s##*/}" 
to 
+1

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

+0

जब मैं इसे स्थापित कर रहा हूं तो मुझे 'dir' के सामने डॉलर नहीं होना चाहिए था। –

+0

हां, अब सबकुछ ठीक काम करता है। धन्यवाद :) –

15

bash स्ट्रिंग कार्यों का उपयोग करना awk ऐसा करने का तरीका होगा:

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

स्पष्टीकरण: के रूप में "/"

  • प्रिंट

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

    एक और तरीका

    IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}" 
    
    +0

    उपयोग करने के लिए सरल: 'printf"% s \ n "" $ {x [-2]} "'। –

    +0

    @gniourf_gniourf, आप सही हैं, धन्यवाद। संपादित – iruvar

    1

    एक:

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

    यह प्रश्न कुछ है THIS

    सुलझाने जो आप कर सकते के लिए:

    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 
    
    0

    बैश parameter expansion का उपयोग करके, आप यह कर सकते हैं:

    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) 
    

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

    +0

    मैंने अभी इसका परीक्षण किया। कोड:: #/bin/श सीडी/var/SVN/रेपोस पथ = "$ 1" गूंज "$ {पथ}" dir = "$ {पथ% FreeBSD पर यहाँ मेरी परिणाम हैं/*} " गूंज" $ {dir} " वास्तविक =" $ {dir ## * /} " गूंज" $ {वास्तविक} " --------------- ------------------------- परिणाम: $ ./makerepo.sh/var/test /var/test /var var $ ------------------------------------ फ़ै एल! माफ़ कीजिये। एक अच्छी विधि माना लेकिन सही जवाब नहीं। –

    +0

    कोई बात नहीं। मुझे बस एहसास हुआ कि क्या हुआ! –