पथ से निर्देशिका निकालें


123

मेरी स्क्रिप्ट में मुझे उस फ़ाइल की निर्देशिका की आवश्यकता है जिसके साथ मैं काम कर रहा हूं। उदाहरण के लिए, फ़ाइल = "सामान / बैकअप / file.zip" । मुझे चर से " सामान / बैकअप / " प्राप्त करने का एक तरीका चाहिए $file

जवाबों:


204
dirname $file

वह है जो आप ढूंढ रहे हैं


+1, मुझे इसे हराएं। तेज हो गया होता लेकिन अधिक से अधिक प्रवेश करने के लिए prompoted थाdirname $file
matchew

1
dirname "$file"बल्कि। यदि फ़ाइल या निर्देशिका नाम में रिक्त स्थान है, तो उद्धरण के बिना यह गलत व्यवहार करेगा।
चार्ल्स डफी

fml, इस सवाल को फ़ाइल से पूर्ण डीआईआर निकाला जाना चाहिए, मैं यह कैसे करूं? dirname पैदावार सापेक्ष पथ मुझे लगता है
अलेक्जेंडर मिल्स

यह बकाया है कि एक जीत बैच स्क्रिप्ट को पूरा करना कितना मुश्किल है - मुझे लगता है कि उनका उपयोग नहीं करने का एक और कारण!
बंकरडिव

47
dirname $file

उत्पादन होगा

stuff/backup

जो इसके विपरीत है basename:

basename $file

उत्पादन होगा

file.zip

मुझे लगा कि मैट वहाँ से (आदमी dirname) यह पता लगाने में सक्षम हो जाएगा :)
Matthieu

1
मुझे लगता है कि हम सब मैट के यहाँ हैं। केवल अनुमान है। लेकिन मैं सिर्फ अपने जवाब को आपसे अलग करने की कोशिश कर रहा था। =)
matchew

हाँ, मैं बहुत सारे बेसन का उपयोग करता हूं, यह बहुत ही निफ्टी है =) लेकिन मुझे अभी Google पर फ़ाइल के डीआईआर को वापस करने के बारे में कुछ भी नहीं मिला! मुझे लगता है कि मैं सही शब्द नहीं देख रहा था। हह, हम सभी 3 मट? : डी
मैट

1
यह सुनिश्चित करने के लिए आवश्यक उद्धरण जोड़ने पर विचार करें कि ये कमांड रिक्त स्थान (ग्लोब वर्ण, आदि) वाले नामों के साथ काम करते हैं।
चार्ल्स डफी

3

${file%/*}जैसा कि आप बाहरी आदेश पर भरोसा नहीं करेंगे, उर्विन / लुफी द्वारा सुझाई गई तकनीक का उपयोग करना तकनीकी रूप से बेहतर है। बेसनेम को उसी तरह से पाने के लिए जैसा आप कर सकते थे ${file##*/}। जब तक आपको आवश्यकता न हो, बाहरी आदेश का उपयोग करना अनावश्यक है।

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

यह पूरी तरह से POSIX अनुपालन भी होगा। आशा करता हूँ की ये काम करेगा! :-)


1
वहाँ एक मामला है जहाँ dirname(अधिक कुशल) अंतर्निहित दृष्टिकोण पर एक फायदा है, और यदि आप निश्चित नहीं हैं कि आपका मार्ग शुरू करने के लिए पूरी तरह से योग्य है। अगर आपके पास है file=file.zip, dirname "$file"तो लौटेगा ., जबकि ${file%/*}वापस आएगा file.zip
चार्ल्स डफी

1
... बेशक, आप शाखा कर सकते हैं: case $file in */*) dir=${file%/*};; *) dir=.;; esacअभी भी POSIX-y है और समस्या को संबोधित करता है।
चार्ल्स डफी


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