CD引数の大文字と小文字を区別しないようにするにはどうすればよいですか?


9

さまざまなディレクトリにアクセスしているときに、Linuxシステムのディレクトリの名前または少なくとも一部の名前を覚えていることがよくあります。ただし、一部のディレクトリの名前は、最初の文字が大文字か、大文字の名前の真ん中にある文字の1つで始まっています。

cdコマンドケースINSENSITIVEの後に引数を作成する方法を誰かが提案できますか。実行しcd BackupDirectoryたりcd backupdirectory、ディレクトリ名BackupDirectoryを入力したりできるようになります。

もちろん、私は他のユーザーのために物事を台無しにしたくないので、上記が可能であれば、変更は私が使用しているセッションにのみ適用され、他のユーザーには影響を与えない可能性はありますか?

はい、試してみset completion-ignore-caseましたが、うまくいき ません。私が入力した場合、それはちょうどそれに役立ちますcd bし、TabあるいはEsc Esc、それはケースを無視して、ディレクトリ名を埋めます。しかし、私が必要なのは、を実行cd backupdirectoryした場合、ケースを無視BackupDirectoryして自分で入るだけです。


どのようにあいまいさを避けますか?あなたが持っている場合backUPbackUp、どのように考えbackup、あなたが行きたいディレクトリにありませんか?
Bernhard

どのシェルを使用していますか?
Gert van den Berg

mcGUIなどのツールの使用を検討したり、GUIに切り替えたりしたことはありますか?生活をずっと楽にします。
ott-- 2013年

回答:


17

有効化cdspellすると次のことが可能になります。

shopt -s cdspell

manページから:

cdspell 設定されている場合、cdコマンドのディレクトリコンポーネントのスペルの小さなエラーが修正されます。チェックされるエラーは、転置文字、欠落文字、1文字多すぎです。修正が見つかると、修正されたファイル名が出力され、コマンドが続行されます。このオプションは対話型シェルでのみ使用されます。


このコマンドを実行した後、変更を有効にするために何かする必要がありますか?
Nathan Arthur

単に私のために何もしていませんcdspell -s shopt入るので、私はそう引き受ける
sdfsdf

10

バッシュ

set completion-ignore-case on~/.inputrc(またはbind 'set completion-ignore-case on'~/.bashrc)私の推薦になるでしょう。フルネームを入力するのであれば、なぜShiftキーを数回押すだけなのか?

しかし、本当に必要cdな場合は、完全一致を試行するラッパーが次のようになり、一致がない場合は、大文字と小文字を区別しない一致を探し、それが一意である場合はそれを実行します。nocaseglob大文字と小文字を区別しないグロビングにシェルオプションを使用し、追加によって引数をグロブに変換します@()(何にも一致せず、が必要ですextglob)。この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バージョンです。この場合も、大文字と小文字を区別せずに補完できるようにするのがおそらく最良の選択肢です。次の設定は、大文字と小文字が完全に一致しない場合、大文字と小文字を区別しないグロビングにフォールバックします。

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、そうでなければ、シェルオプションがめちゃくちゃになってしまいます。)
Gilles 'SO- stop be evil'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.