कैसे बनाने के लिए `सीडी dir / फ़ाइल नाम` मुझे dir / करने के लिए ले?


10

मुझे फ़ाइल तर्क के cdसाथ उपयोग करने में सक्षम होना बहुत सुविधाजनक लगेगा ।

cd myDirectory/anyname.anyExtension के बराबर होगा cd myDirectory/

इस व्यवहार को प्राप्त करने के लिए सबसे अच्छा उपनाम या कार्य क्या होगा?

संपादित करें : क्षमा करें, मैंने 1 स्थान पर इसका उल्लेख नहीं किया: मैं उपयोग करता हूंzsh

जवाबों:


5

में zsh, मैं अक्सर करता हूं:

cd /path/to/somefile(:h)

(के hलिए head)।

यदि somefileकोई सिमलिंक है, तो आप भी कर सकते हैं:

cd somefile(:A:h)

उस निर्देशिका में जाने के लिए जहां सिम्लिंक का लक्ष्य मिल सकता है।


zshक्रिस के बराबर 'अब bash-only समाधान होगा:

cd() {
  [[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
  builtin cd "$@"
}

में zsh, आप "शब्दों" Ctrl-Wको हटा भी सकते हैं ।

में zsh, "शब्द" शब्द के आधार पर प्रस्ताव / पक्षांतरित / हटाने विगेट्स के संदर्भ में में alnums के दृश्यों के साथ साथ चरित्र $WORDCHARSचर जो डिफ़ॉल्ट रूप से शामिल हैं /

आप को दूर कर सकता है /से $WORDCHARSइतना है कि Ctrl-Wकेवल एक ही रास्ता घटक को हटाता है:

WORDCHARS=${WORDCHARS/\/}

एक अन्य उपयोगी विस्तार select-word-styleविजेट है जिसे आप विभिन्न शब्द शैलियों के बीच इंटरेक्टिव रूप से चुनने के लिए उपयोग कर सकते हैं।

autoload select-word-style
zle -N select-word-style
bindkey '\ew' select-word-style

फिर दबाने Alt-Wसे आप विभिन्न शब्द शैलियों के बीच चयन कर सकते हैं।

$ cd /blah/blih<Alt-W>
Word styles (hit return for more detail):
(b)ash (n)ormal (s)hell (w)hitespace (d)efault (q)uit
(B), (N), (S), (W) as above with subword matching
?

दिलचस्प। (मैं भी zsh का उपयोग करता हूं)।
सेबास्टियन

zshऔर शब्द शैलियों की शक्ति पर बहुत दिलचस्प संपादन । zshकमांड के लिए भी धन्यवाद । यह काम पूरी तरह से करता है।
सेबास्टियन

16

मुझे लगता है कि आप अभी भी मूल कार्यक्षमता को बनाए रखना चाहते हैं यदि आप एक निर्देशिका इनपुट करते हैं, और आप उपयोग कर रहे हैं bash

cd() {
    local file="${!#}"

    if (( "$#" )) && ! [[ -d "$file" ]]; then
        builtin cd "${@:1:($#-1)}" "${file%/*}"
    else
        builtin cd "$@"
    fi
}

यदि आप सीडी के विकल्प ( -Pआदि) का उपयोग करने वाले नहीं हैं , तो यह भी पर्याप्त होगा:

cd() { 
    if [ -d "$1" ] || [ -z "$1" ]; then
        builtin cd "$@"
    else
        builtin cd "${1%/*}"
    fi
}

4
अगर आप cd के लिए फंक्शन का नाम बदलकर कॉल के builtinसामने जोड़ना चाहते cdहैं
उलरिक डांगेल

@ क्रिस: आपने सही मान लिया;) इस फ़ंक्शन का उपयोग करने के लिए तैयार होने के लिए धन्यवाद
Sébastien

cdविकल्प को संरक्षित करने वाले संस्करण के साथ काम नहीं करता है zsh। सरल एक के साथ ठीक काम करता है zsh, लेकिन BUT cdअब समान नहीं है cd ~: /
Sbbastien

@ सेबैस्टियन अब कोशिश करो, मुझे लगता है कि इसे ठीक करना चाहिए।
क्रिस डाउन

@ क्रिस, वास्तव में एक चेक जोड़ने के लिए [ -z "$1" ]पर्याप्त था। मैंने स्टीफन के उत्तर को अधिक दृश्यता देने के लिए स्वीकार कर लिया है, क्योंकि यह सबसे अच्छा समाधान है zsh
सेबास्टियन

7

आप dirnameपथ से फ़ाइल नाम को हटाने के लिए उपयोग कर सकते हैं , उदाहरण के लिए

mycd() { cd "$(dirname "$1")"; }

देखते हैं man dirname


3
ध्यान दें कि यदि आप किसी निर्देशिका को इनपुट करते हैं, तो यह उस निर्देशिका से ऊपर की निर्देशिका में बदल जाएगा , जो वांछित नहीं हो सकता है (यह इस प्रश्न से स्पष्ट नहीं है कि यह वांछित है या नहीं)।
क्रिस डाउन

1
@ क्रिसडाउन ट्रू, लेकिन मैंने पाठक को एक अभ्यास के रूप में छोड़ दिया और आपका जवाब दिखाता है कि इससे कैसे निपटना है।
एड्रियन फ्रुविर्थ

1
@ AdrianFrühwirth एक व्यायाम! हा!

3

यदि आप .profileइसे अपने साथ जोड़ते हैं , तो इसे लोड करें ( source ~/.profileया लॉग आउट करें और फिर से लॉग इन करें), फिर mycd [file or directory]आपको सही निर्देशिका में ले जाएगा:

mycd() { if [ -d "$1" ]; then cd "$1"; else cd "$( dirname "$1" )"; fi ; }

अगर आप इसका नाम लेंगे cd, तो अजीब चीजें होंगी।


1
यदि निर्देशिका नाम में व्हॉट्सएप है, तो यह टूट जाएगा, और कमांड समूह को समाप्त करने के लिए आपको एक समापन अर्धविराम की आवश्यकता होगी। आपके लिए इसे संपादित किया गया, आशा है कि आप बुरा नहीं मानेंगे।
क्रिस डाउन

@ क्रिसडाउन, हालांकि यह अन्य गोले का सच है, आपको समापन अर्धविराम की आवश्यकता नहीं है zsh
स्टीफन चेज़लस

इसके अलावा, अगर यह गुजरता है cd, तो जैसे टूट जाता है -P
क्रिस डाउन

0
cd2() {
 arg=() dir= cmd= IFS=" " msg='[-L|[-P [-e]]|-h] [dir|file]'

 while [ "$#" -gt 1 ] ; do
  case "$1" in
   -h) printf "%s: cd2 %s\n" "$0" "$msg"
    return 1 ;;
   *) arg+=("$1") ;;
  esac
  shift
 done

 [ -f "${1:-}" ] && dir="$(dirname ${1:-})" || dir="${1:A}"
 [ ! -z "$arg" ] && cmd="cd ${arg[@]} $dir" || cmd="cd $dir"

 if ! $cmd 2>/dev/null; then
  printf "%s: cd2 %s\n" "$0" "$msg"
  return 1
 fi
}

नामक एक निर्देशिका को देखते हुए $(sudo reboot), यह फ़ंक्शन सिस्टम को रिबूट कर सकता है। इसके अलावा, उपयोगकर्ता उपयोग कर रहा है zsh, नहीं bash
Kusalananda

कोई भी कमांड $ (sudo reboot) दें, यह फ़ंक्शन सिस्टम को रिबूट करेगा। इसके अलावा, +1 ने शुरू में 'zsh' को नोटिस नहीं किया - अच्छी पकड़।
ecwpz91

नहीं, cd '$(sudo reboot)'निर्देशिका बदल जाएगी, जबकि आपका फ़ंक्शन नाम का मूल्यांकन करने का प्रयास करेगा।
Kusalananda

आह, मैंने परिवर्तन देखे और किए। मुझे बताएं कि क्या वह काम करता है? अच्छी पकड़।
ecwpz91
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.