आप इसे कर सकते हैं:
cd /usr///.//share/../share//man/man1 || exit
IFS=/; set -f
printf %.1s/ ${PWD%/*}
printf %s\\n "${PWD##*/}"
/u/s/m/man1
और यहाँ है sed
:
printf %s "$file" |
tr /\\n \\n/ | sed -et$ \
-e '\|^\.\.$|{x;s|\(.*\)\n.*$|\1|;x;}' \
-e 's|^\.\{0,2\}$||;\|.|H;$!d;x' \
-e$ -e '\|\(\.\{0,2\}.\)\(.*\)\(\n\)|!b' \
-e 's||\1\3\2\3|;P;s|\n||;D' |
tr /\\n \\n/
कि सभी एक ही सामान नीचे कार्य करने के लिए करीब आता है। यह टिल्ड्स के साथ संक्षिप्त नहीं है या $PWD
एक प्रमुख गैर-स्लैश के लिए सिर को सम्मिलित करता है जैसा कि फ़ंक्शन करता है (और वास्तव में, कभी भी प्रमुख स्लैश प्रिंट नहीं करता है) लेकिन बाद में इसे संभाला जा सकता है। यह अशक्त पथ घटकों, और एकल बिंदुओं, और मातम की प्रक्रिया करता है..
मामलों को है।
इसके ऊपर एक ही man
रास्ता दिया गया है cd
:
u/s/m/man1
यह प्रत्येक पथ घटक के लिए एक या दो अतिरिक्त अग्रणी डॉट्स भी मुद्रित करेगा जो इस तरह के साथ शुरू होता है और सिर्फ एक या दो डॉट्स नहीं है।
आपने पथ-घटक शुरुआत के लिए एक से अधिक वर्ण करने के बारे में पूछा है .
। यह करने के लिए मुझे लगा कि प्रत्येक घटक को वैसे भी व्यक्तिगत ध्यान देने की आवश्यकता होगी, और क्योंकि मैं उत्सुक था, मैंने बदलाव निर्देशिका के बिना विहित पथ पर काम करने में अपना हाथ आजमाया। कुछ ट्रायल-एंड-एरर के बाद, मैंने आखिरकार यह करने का एकमात्र तरीका तय किया कि इसे दो बार करना है - पीछे और आगे:
pathbytes(){
local IFS=/ o="$-" p
set -f${ZSH_VERSION+LFy}
set -- ${1:-$PWD}
for p in /${1:+$PWD} $*
do case $p in (.|"") ;;
(..) ${1+shift} ;;
(/) set -- ;;
(*) set -- $p $*; esac
done
for p in //$* ""
do case ${p:-/$3} in
([!./]*) ;;
(..*) set "..$@" ;;
(.*) set ".$@" ;;
(//*) ! set "" $1 $1 ;;
(~) ! p=\~ ;;
(~/*) p="~/$2";set $HOME
! while "${2+shift}" 2>&3
do p="~/${p#??*/}"
done 3>/dev/null;;
esac&& set "" "${p%"${p#$1?}"}/$2" "$p/$3"
done; printf %s\\n "${p:-$2}"
set +f "-${o:--}"
}
ताकि कभी भी निर्देशिका न बदले या किसी पथ घटक के अस्तित्व की पुष्टि करने की कोशिश न करे, लेकिन यह बार-बार /
परिसीमन को निचोड़ता है और /./
एकल-डॉट घटकों को पूरी तरह से छोड़ देता है, और /../
दोहरे-डॉट घटकों को उचित रूप से संसाधित करता है।
जब $IFS
कुछ गैर-व्हाट्सएप चरित्र पर सेट किया जाता है , तो दो या दो से अधिक $IFS
वर्णों के अनुक्रम के परिणामस्वरूप एक या अधिक अशक्त क्षेत्र होंगे। इतने सारे लगातार स्लैश अशक्त-मूल्यवान तर्क के लिए काम करते हैं। एक प्रमुख $IFS
चरित्र के लिए भी यही सच है । और इसलिए जब set -- $1
विभाजन होता है, यदि परिणाम $1
शून्य है, तो यह एक स्लेश के साथ शुरू हुआ, अन्यथा, ${1:+$PWD}
यदि यह शून्य नहीं है, तो मैं सम्मिलित करता हूं $PWD
। दूसरे शब्दों में, यदि पहला तर्क स्लैश के साथ शुरू नहीं होता है, तो यह $PWD
पूर्वनिर्मित हो जाएगा । यह पथ सत्यापन के समान है ।
अन्यथा, पहला for
लूप मार्ग के घटकों के क्रम को पुनरावृत्ति करता है, जैसे:
1 2 3
1 2 3
2 1 3
3 2 1
... ऐसा करते समय यह किसी एक-डॉट या अशक्त घटकों की उपेक्षा करता है, और इसके लिए ..
करता है ...
1 .. 3
1 .. 3
3
3
... दूसरा पास इस प्रभाव को उलट देता है, और ऐसा करते समय यह प्रत्येक घटक को 2-डॉट्स + चार , या 1-डॉट + चार , या चार को निचोड़ता है ।
इसलिए इसे अस्तित्व की परवाह किए बिना एक विहित मार्ग पर काम करना चाहिए।
मैंने दूसरे लूप में थोड़ा जोड़ा / घटाया। अब यह set
अक्सर कम होता है (प्रत्येक [!./]*
घटक के लिए केवल एक बार ) , और शॉर्ट-सर्किट case
पैटर्न का मूल्यांकन अधिकांश समय (उपर्युक्त पैटर्न के लिए धन्यवाद) , और इसके खिलाफ एक टेल-कॉल मैच-मूल्यांकन भी शामिल है ~
। अंत में विहित पथ के सभी या एक प्रमुख भाग (पूरे घटकों पर विभाजित के रूप में)~
मिलान कर सकते हैं , मिलान बिट छीन लिया जाएगा और एक शाब्दिक ~
प्रतिस्थापित किया जाएगा। ऐसा करने के लिए, मुझे संक्षिप्त रूप के साथ-साथ पथ की एक पूरी प्रतिलिपि बनाए रखनी होगी (क्योंकि संक्षिप्त पथ से मेल खाते हुए ~
संभवतः बहुत उपयोगी नहीं होगा) , और इसलिए इसे इसमें रखा गया है$3
। अंतिमwhile
यदि ~
एक सबसेट के रूप में मिलान किया जाता है तो लूप ब्रांच को केवल चलाया जाता है $3
।
यदि आप इसे set -x
ट्रेस सक्षम के साथ चलाते हैं तो आप इसे देख सकते हैं।
$ (set -x;pathbytes ..abc/def/123///././//.././../.xzy/mno)
+ pathbytes ..abc/def/123///././//.././../.xzy/mno
+ local IFS=/ o=xsmi p
+ set -f
+ set -- ..abc def 123 . . .. . .. .xzy mno
+ set --
+ set -- home
+ set -- mikeserv home
+ set -- ..abc mikeserv home
+ set -- def ..abc mikeserv home
+ set -- 123 def ..abc mikeserv home
+ shift
+ shift
+ set -- .xzy ..abc mikeserv home
+ set -- mno .xzy ..abc mikeserv home
+ set mno mno
+ set . mno mno
+ set .x/mno .xzy/mno
+ set .. .x/mno .xzy/mno
+ set ..a/.x/mno ..abc/.xzy/mno
+ set m/..a/.x/mno mikeserv/..abc/.xzy/mno
+ set h/m/..a/.x/mno home/mikeserv/..abc/.xzy/mno
+ p=~/h/m/..a/.x/mno
+ set home mikeserv
+ shift
+ p=~/m/..a/.x/mno
+ shift
+ p=~/..a/.x/mno
+
+ printf %s\n ~/..a/.x/mno
~/..a/.x/mno
+ set +f -xsmi
/f/b/.c/wizard_magic
। एक विशेष निर्देशिका में डॉट अक्सर इतना सामान्य होता है, जहां आपको दिखना चाहिए।