कैसे निर्देशिका पथ के अंतिम स्लैश पट्टी करने के लिए?


17

मेरे पास एक स्क्रिप्ट है जिसके लिए एक तर्क के रूप में एक निर्देशिका की आवश्यकता होती है। मैं दो रूप का समर्थन करना चाहता हूं: एक जैसा है

a/b/c

(अंत में कोई स्लैश नहीं) और दूसरा जैसा है

 a/b/c/

(अंत में स्लैश है)।

मेरा प्रश्न: दोनों में से किसी भी एक रूप को देखते हुए, मैं केवल पहले फॉर्म को अपरिवर्तित कैसे रख सकता हूं और दूसरे फॉर्म के अंतिम स्लैश को पहले फॉर्म में बदलने के लिए पट्टी कर सकता हूं।


2
ऐसा नहीं है कि यह एक समस्या के रूप में होना चाहिए - शुरुआत में कहीं भी एक डबल स्लैश एक एकल स्लैश के बराबर है, इसलिए उनका उपयोग करने में शामिल होने के बारे में चिंता न करें /
मूरू

@ मुरू मैं इससे पहले नहीं जानता था :)।
यूलोंग एओ

यहाँ एक अच्छा Q / A मल्टीपल
कंसिस्टेंट

1
@ एमरू अंत में एक स्लैश एक अंतर बना सकता है, जैसे कि एक सिम्कलिन पर अभिनय और उस निर्देशिका पर अभिनय के बीच का अंतर जो इसे इंगित करता है, या स्रोत तर्क rsync
गिल्स एसओ- बुराई को रोकें '

@ गिल्स वास्तव में, लेकिन जैसा कि आप देख सकते हैं, मैं पथ से जुड़ने की बात कर रहा हूं।
मूरू

जवाबों:


23
dir=${1%/}

स्क्रिप्ट के पहले पैरामीटर को ले जाएगा और यदि कोई एक है तो ट्रेलिंग स्लैश को हटा देगा।


12

यदि कोई एक है, तो एक अनुगामी स्लैश को हटाने के लिए, आप सभी POSIX- शैली के गोले में मौजूद प्रत्यय हटाने के पैरामीटर विस्तार निर्माण का उपयोग कर सकते हैं :

x=${x%/}

कुछ जटिलताएँ हैं। यह केवल एक स्लैश को हटाता है, इसलिए यदि आपने शुरुआत की है a/b/c//तब भी आप स्लैश के साथ समाप्त होंगे। इसके अलावा, यदि मूल मार्ग था /, तो आपको स्लैश रखने की आवश्यकता है। यहाँ एक और अधिक जटिल समाधान है जो इन मामलों की देखभाल करता है:

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

वैकल्पिक रूप से, ksh में, या बाद में बैश में shopt -s extglob:

[[ x = *[!/] ]] || x=${x%%*(/)}

ध्यान दें कि कई मामलों में, यह कोई फर्क नहीं पड़ता है कि एक अनुगामी स्लैश है। इससे कोई फर्क नहीं पड़ता कि तर्क एक निर्देशिका का एक प्रतीकात्मक लिंक है: अनुगामी स्लैश के साथ, तर्क निर्देशिका को नामित करता है, जबकि कोई अनुगामी स्लैश के साथ, तर्क प्रतीकात्मक लिंक को नामित करता है। यह कुछ अन्य कार्यक्रमों के साथ भी मायने रखता है, उदाहरण के लिए rsyncएक अनुगामी स्लेश की उपस्थिति के आधार पर स्रोत तर्क को अलग तरह से व्यवहार किया जाता है।


2

realpathदिए गए मार्ग को हल करता है। अन्य बातों के अलावा यह ट्रेलिंग स्लैश को भी हटाता है। -sनिम्नलिखित simlinks को रोकने के लिए उपयोग करें

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.