CD 인수를 대소 문자를 구분하지 않는 방법?


9

때로는 다양한 디렉토리에 액세스하는 동안 Linux 시스템에서 디렉토리 이름 또는 디렉토리 이름의 적어도 일부를 기억하는 경우가 대부분 발생합니다. 그러나 일부 디렉토리의 이름은 첫 문자 대문자로 시작하거나 대문자 중간에있는 문자 중 하나로 시작됩니다.

누구나 cd수행 cd BackupDirectory하거나 cd backupdirectory디렉토리 이름을 BackupDirectory로 입력 할 수 있도록 명령 사례 INSENSITIVE에 따라 인수를 만드는 방법을 제안 할 수 있습니까 ?

물론 다른 사용자를 위해 문제를 해결하고 싶지 않으므로 위의 경우 가능하면 변경 사항을 사용중인 세션에만 적용 할 수 있습니까? 다른 사용자에게는 영향을 미치지 않습니까?

좋아, 나는 시도 set completion-ignore-case했지만 이것이 효과가 없다. 내가 입력하면 그것은 그냥하는 데 도움이 cd b하고 Tab또는 Esc Esc이 사건을 무시하고 디렉토리 이름을 채 웁니다. 그러나 내가 필요한 것은을 수행 cd backupdirectory하면 사례를 무시 BackupDirectory하고 자체적으로 입력 됩니다.


모호성을 피하는 방법은 무엇입니까? 당신이있는 경우 backUPbackUp, 어떻게 것이 backup더있는 디렉토리로 당신은 가고 싶지?
Bernhard

어떤 쉘을 사용하고 있습니까?
게르트 반 덴 버그

mcGUI 와 같은 도구를 사용 하거나 GUI로 전환 하는 것을 고려 했습니까 ? 인생을 훨씬 쉽게 만듭니다.
ott--

답변:


17

활성화 cdspell하면 도움이됩니다.

shopt -s cdspell

로부터 man페이지 :

cdspell 설정되면, cd 명령에서 디렉토리 구성 요소의 철자에 작은 오류가 정정됩니다. 확인 된 오류는 전치 된 문자, 누락 된 문자 및 한 문자가 너무 많습니다. 수정 사항이 있으면 수정 된 파일 이름이 인쇄되고 명령이 진행됩니다. 이 옵션은 대화식 쉘에서만 사용됩니다.


변경 사항을 적용하려면이 명령을 실행 한 후 무엇을해야합니까?
Nathan Arthur

나는 단순히 shopt -s cdspell을 입력하는 것이 나를 위해 아무것도하지 않기 때문에 그렇게 가정 할 것이다
sdfsdf

10

세게 때리다

set completion-ignore-case on에서 ~/.inputrc(또는 bind 'set completion-ignore-case on'에서 ~/.bashrc) 내 추천이 될 것입니다. 전체 이름을 입력하려는 경우 Shift키를 몇 번 누를 때 왜 울리는가 ?

그러나 당신이 정말로 그것을 원한다면, 여기 cd에 정확한 일치를 시도 하는 래퍼 가 있습니다. nocaseglob대소 문자를 구분하지 않는 globbing에 쉘 옵션을 사용하고 @()(아무것도 일치하지 않고 필요로하는 extglob) 를 추가하여 인수를 glob로 바꿉니다 . extglob옵션은 그렇지 bash는 심지어 그것을 구문 분석 할 수 없습니다 함수를 정의 할 때 점등되어야한다. 이 기능은을 지원하지 않습니다 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
}

Ksh

내가하고있는 동안 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 버전이 있습니다. 대소 문자를 구분하지 않고 완료하는 것이 가장 좋은 방법 일 것입니다. 대소 문자가 정확히 일치하지 않으면 다음 설정은 대소 문자를 구분하지 않는 globbing으로 돌아갑니다.

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 그렇습니다. 왜냐하면 아스카가 이미 알고 있었기 때문에 여기에 암시 적이지만 앞으로 방문자를 위해 내 대답에 추가 할 것입니다.
Gilles 'SO- 악의를 멈추십시오'

cd로 이것을 사용하려고 할 때 다음과 같은 오류가 발생합니다. cd:cd:17: no such file or directory: videos(디렉토리가 있습니다 Videos)
Sridhar Sarnobat

@ user7000 어떤 버전에서 어떤 셸에서 사용합니까?
Gilles 'SO- 악마 그만해

1
@ user7000 zsh 5.0.7에서 작동합니다. 글 로빙 작동 방식을 변경하는 옵션을 설정했을 수도 있습니다. 로 변경하면 도움 emulate -L zshemulate -LR zsh되나요? (있었어야했는데 난 그냥 버그를 고정 방식으로 emulate -L zsh,하지 emulate zsh, 그렇지 않으면 엉망 쉘 옵션 것입니다.)
질 'SO-정지되는 악'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.