Cd तर्कों को कैसे असंवेदनशील बनाया जाए?


9

कभी-कभी विभिन्न निर्देशिकाओं को एक्सेस करते समय यह ज्यादातर बार होता है कि मुझे हमारे लिनक्स सिस्टम के तहत नाम या निर्देशिका के नामों का कम से कम हिस्सा याद है। लेकिन कुछ निर्देशिकाओं का नाम ऊपरी चरित्र नाम या ऊपरी अक्षर के बीच के अक्षर से शुरू किया जाता है।

क्या कोई सुझाव दे सकता है कि मैं cdकमांड केस INSENSITIVE के बाद तर्क कैसे बना सकता हूं , जैसे कि यदि मैं प्रदर्शन करता हूं cd BackupDirectoryया cd backupdirectoryयह निर्देशिका नाम BackupDirectory दर्ज कर सकता है।

निश्चित रूप से मैं अन्य उपयोगकर्ताओं के लिए चीजों को पेंच नहीं करना चाहता हूं, इसलिए यदि उपरोक्त संभव है, तो क्या यह संभव है कि परिवर्तन को उस सत्र में लागू किया जा सकता है जिसे मैं उपयोग कर रहा हूं और अन्य उपयोगकर्ताओं को प्रभावित नहीं करता?

ठीक है, मैंने कोशिश की set completion-ignore-case, लेकिन यह सिर्फ काम नहीं करता है। अगर मैं टाइप करता हूं cd bऔर Tabया Esc Escकेस को नजरअंदाज करते हुए डायरेक्टरी नाम भरता है तो यह इसमें मदद करता है । लेकिन, मुझे क्या चाहिए अगर मैं ए करता हूं cd backupdirectory, यह सिर्फ मामले को नजरअंदाज करता है और BackupDirectoryअपने आप में प्रवेश करता है ।


आप अस्पष्टता से कैसे बचेंगे? यदि आपके पास backUPऔर backUp, कैसे होगा backupकोई जो निर्देशिका में आप जाना चाहते हैं?
बर्नहार्ड

आप किस खोल का उपयोग कर रहे हैं?
गर्ट वैन डेन बर्ग

क्या आपने किसी टूल का उपयोग mcकरने या GUI पर स्विच करने पर विचार किया है? जीवन को बहुत आसान बना देता है।
ott-- 20

जवाबों:


17

सक्षम करने cdspellमें मदद मिलेगी:

shopt -s cdspell

से manपेज:

cdspell यदि सेट किया जाता है, तो cd कमांड में डायरेक्टरी कंपोनेंट की स्पेलिंग में छोटी-मोटी त्रुटियां ठीक की जाएंगी। के लिए जाँच की गई त्रुटियों को ट्रांसपोंड कैरेक्टर्स, एक मिस-आईएनजी कैरेक्टर, और एक कैरेक्टर बहुत सारे हैं। यदि कोई सुधार पाया जाता है, तो सही फ़ाइल नाम मुद्रित होता है, और कमांड आगे बढ़ती है। यह विकल्प केवल इंटरैक्टिव गोले द्वारा उपयोग किया जाता है।


परिवर्तन में प्रभावी होने के लिए इस आदेश को चलाने के बाद क्या आपको कुछ करना है?
नाथन आर्थर

मैं ऐसा इसलिए मान रहा हूँ क्योंकि बस shopt -s cdspell में प्रवेश करना मेरे लिए कुछ नहीं कर रहा है
sdfsdf

10

दे घुमा के

set completion-ignore-case onमें ~/.inputrc(या bind 'set completion-ignore-case on'में ~/.bashrc) मेरी सिफारिश की जाएगी। यदि आप पूरा नाम टाइप करने जा रहे हैं, तो Shiftकुंजी के कुछ प्रेस पर क्यों ?

लेकिन अगर आप वास्तव में यह चाहते हैं, तो यहां एक रैपर है cdजो एक सटीक मैच के लिए कोशिश करता है, और यदि कोई नहीं है, तो केस-असंवेदनशील मैच की तलाश करता है और यह अद्वितीय होने पर करता है। यह nocaseglobकेस-असंवेदनशील ग्लोबिंग के लिए शेल विकल्प का उपयोग करता है , और तर्क को एक ग्लोब में जोड़कर बदल देता है @()(जो कुछ भी नहीं मिलता है, और आवश्यकता होती है extglob)। extglobविकल्प अन्यथा पार्टी भी यह पार्स नहीं कर सकता, जब समारोह को परिभाषित करने पर दिया जाना है। यह फ़ंक्शन समर्थन नहीं करता है CDPATH

shopt -s extglob
cd () {
  builtin cd "$@" 2>/dev/null && return
  local options_to_unset=; local -a matches
  [[ :$BASHOPTS: = *:extglob:* ]] || options_to_unset="$options_to_unset extglob"
  [[ :$BASHOPTS: = *:nocaseglob:* ]] || options_to_unset="$options_to_unset nocaseglob"
  [[ :$BASHOPTS: = *:nullglob:* ]] || options_to_unset="$options_to_unset nullglob"
  shopt -s extglob nocaseglob nullglob
  matches=("${!#}"@()/)
  shopt -u $options_to_unset
  case ${#matches[@]} in
    0) # There is no match, even case-insensitively. Let cd display the error message.
      builtin cd "$@";;
    1)
      matches=("$@" "${matches[0]}")
      unset "matches[$(($#-1))]"
      builtin cd "${matches[@]}";;
    *)
      echo "Ambiguous case-insensitive directory match:" >&2
      printf "%s\n" "${matches[@]}" >&2
      return 3;;
  esac
}

क्ष

जब मैं इस पर हूँ, यहाँ ksh93 के लिए एक समान कार्य है। ~(i)केस-संवेदी मिलान के लिए संशोधित के साथ असंगत प्रतीत हो रहा है /प्रत्यय केवल निर्देशिका मैच के लिए (इस ksh की मेरी रिहाई में एक बग हो सकता है)। इसलिए मैं एक अलग रणनीति का उपयोग करता हूं, गैर-निर्देशिकाओं को बाहर करने के लिए।

cd () {
  command cd "$@" 2>/dev/null && return
  typeset -a args; typeset previous target; typeset -i count=0
  args=("$@")
  for target in ~(Ni)"${args[$(($#-1))]}"; do
    [[ -d $target ]] || continue
    if ((count==1)); then printf "Ambiguous case-insensitive directory match:\n%s\n" "$previous" >&2; fi
    if ((count)); then echo "$target"; fi
    ((++count))
    previous=$target
  done
  ((count <= 1)) || return 3
  args[$(($#-1))]=$target
  command cd "${args[@]}"
}

Zsh

अंत में, यहाँ एक zsh संस्करण है। फिर, केस-असंवेदनशील पूर्णता की अनुमति देना संभवतः सबसे अच्छा विकल्प है। निम्न सेटिंग केस-असंवेदनशील ग्लोबिंग पर वापस आती है यदि कोई सटीक केस मैच न हो:

zstyle ':completion:*' '' matcher-list 'm:{a-z}={A-Z}'

''सभी केस-असंवेदनशील मैचों को दिखाने के लिए निकालें, भले ही एक सटीक केस मैच हो। आप इसे मेनू इंटरफ़ेस से सेट कर सकते हैं compinstall

cd () {
  builtin cd "$@" 2>/dev/null && return
  emulate -L zsh
  setopt local_options extended_glob
  local matches
  matches=( (#i)${(P)#}(N/) )
  case $#matches in
    0) # There is no match, even case-insensitively. Try cdpath.
      if ((#cdpath)) &&
         [[ ${(P)#} != (|.|..)/* ]] &&
         matches=( $^cdpath/(#i)${(P)#}(N/) ) &&
         ((#matches==1))
      then
        builtin cd $@[1,-2] $matches[1]
        return
      fi
      # Still nothing. Let cd display the error message.
      builtin cd "$@";;
    1)
      builtin cd $@[1,-2] $matches[1];;
    *)
      print -lr -- "Ambiguous case-insensitive directory match:" $matches >&2
      return 3;;
  esac
}

1
यह भी खूब रही। लेकिन आपको inputrcइसे काम करने के लिए जोड़ना होगा । इस तरह:echo "set completion-ignore-case on" >> ~/.inputrc
jsejcksn

@JesseJackson हां, यह यहां निहित था क्योंकि पूछने वाला पहले से ही जानता था, लेकिन मैं इसे भविष्य के आगंतुकों के लिए अपने जवाब में जोड़ दूंगा।
गिलेस एसओ-

इस के साथ सीडी का उपयोग करने की कोशिश करते समय मुझे निम्न त्रुटि मिलती है: cd:cd:17: no such file or directory: videos(मेरे पास एक डीआईआर है Videos)
श्रीधर सरनोबत

@ user7000 किस संस्करण में, किस शेल के तहत?
गिल्स एसओ- बुराई को रोकें '

1
@ user7000 मेरे लिए zsh 5.0.7 के तहत काम करता है। शायद आपने एक विकल्प निर्धारित किया है जो ग्लोबिंग के काम करने के तरीके को बदलता है? यदि आप में परिवर्तन करते हैं तो क्या यह मदद करता emulate -L zshहै emulate -LR zsh? (वैसे मैंने सिर्फ एक बग तय किया था, जो होना चाहिए था emulate -L zsh, नहीं तो emulate zshयह आपके शेल विकल्पों को गड़बड़ कर देता था।)
गाइल्स का SO- बुराई होना बंद हो '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.