2010-07-20 22 views
147

में अंतिम डायरनाम/फ़ाइल नाम प्राप्त करें मैं एसवीएन के लिए पोस्ट-प्रतिबद्ध हुक लिखने की कोशिश कर रहा हूं, जो हमारे विकास सर्वर पर होस्ट किया गया है। मेरा लक्ष्य है कि प्रतिबद्ध प्रोजेक्ट की प्रतिलिपि को उस निर्देशिका में स्वचालित रूप से चेकआउट करने का प्रयास करें जहां यह सर्वर पर होस्ट किया गया हो। हालांकि मुझे उसी उप-निर्देशिका में चेकआउट करने के लिए स्क्रिप्ट को पास की गई निर्देशिका स्ट्रिंग में केवल अंतिम निर्देशिका को पढ़ने में सक्षम होना चाहिए जहां हमारी परियोजनाएं होस्ट की जाती हैं।बैश - फ़ाइल पथ तर्क

उदाहरण के लिए यदि मैं प्रोजेक्ट "उदाहरण" में एक एसवीएन प्रतिबद्ध करता हूं, तो मेरी स्क्रिप्ट को "/ usr/local/svn/repos/example" को इसके पहले तर्क के रूप में प्राप्त होता है। मुझे स्ट्रिंग के अंत से सिर्फ "उदाहरण" प्राप्त करने की आवश्यकता है और फिर इसे किसी अन्य स्ट्रिंग के साथ संयोजित करें ताकि मैं "/ server/root/example" पर चेकआउट कर सकूं और परिवर्तन तुरंत लाइव देख सकूं।

उत्तर

232

basename एक पथ की सूची उपसर्ग को दूर करता है:

$ basename /usr/local/svn/repos/example 
example 
$ echo "/server/root/$(basename /usr/local/svn/repos/example)" 
/server/root/example 
+2

बेसनाम निश्चित रूप से मैं क्या देख रहा हूं। यद्यपि एक चर में संग्रहीत तर्क के बेसनाम को कैसे प्राप्त किया जा सकता है? जैसे 'SUBDIR ="/पथ/से/जो भी/$ (बेसनाम $ 1) "' – tj111

+0

मुझे त्रुटि मिलती है "बेसनाम: गायब ऑपरेंड" – tj111

+4

@ tj111: लगता है जैसे '$ 1' नहीं है, या '$ 1' खाली है – sth

54

बैश कॉल करने के लिए बिना एक पथ के अंतिम भाग प्राप्त कर सकते हैं बाहरी basename:

subdir="/path/to/whatever/${1##*/}" 
+2

मेरे मैक पर, सबस्ट्रिंग नोटेशन का उपयोग करके डीरनाम/बेसनाम से तीव्रता के क्रम से अधिक है, जहां आप कुछ हज़ार फाइलों में से कुछ के लिए कुछ तुच्छ कर रहे हैं। – George

+0

यह तब तक काम नहीं करता जब मेरा "/ path/to/whatever /" एक चर था। –

+0

@ बटलबूटस: मुझे दिखाएं कि आपने क्या किया और परिणाम के रूप में आप क्या उम्मीद करते थे, क्योंकि यह काम करेगा। –

49

निम्नलिखित दृष्टिकोण हो सकता है पथनाम का कोई भी पथ प्राप्त करने के लिए उपयोग किया जाता है:

pathname=a/b/c 
echo $(basename $pathname) 
echo $(basename $(dirname $pathname)) 
echo $(basename $(dirname $(dirname $pathname))) 

आउटपुट:

c 
b 
a 
संबंधित मुद्दे