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


9

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

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

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

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


모호성을 피하는 방법은 무엇입니까? 당신이있는 경우 backUP와 backUp, 어떻게 것이 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 zsh이 emulate -LR zsh되나요? (있었어야했는데 난 그냥 버그를 고정 방식으로 emulate -L zsh,하지 emulate zsh, 그렇지 않으면 엉망 쉘 옵션 것입니다.)
— 질 'SO-정지되는 악'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.