Хотя идя немного отличающийся от вопроса OP, когда я намеренно не хочу, чтобы команда была сохранена в истории удара, я снабжаю префиксом их пространство. Работы в Ubuntu и ее вариантах, не уверенных, если это работает над всеми системами.
Включение cdspell
поможет:
shopt -s cdspell
От man
страница:
cdspell, Если установлено, незначительные ошибки в написании компонента каталога в команде CD будут исправлены. Ошибки, проверенные на, являются транспонированными символами, мисс - символ луга и один символ слишком многие. Если исправление найдено, исправленное имя файла печатается, и доходы команды. Эта опция только используется интерактивными оболочками.
set completion-ignore-case on
в ~/.inputrc
(или bind 'set completion-ignore-case on'
в ~/.bashrc
) была бы моя рекомендация. Если Вы собираетесь ввести полное имя, почему передумали относительно нескольких нажатий клавиши Shift?
Но если Вы действительно хотите это, вот обертка вокруг cd
это пробует за точное совпадение, и если нет ни одного, не ищет нечувствительное к регистру соответствие и выполняет его, если это уникально. Это использует nocaseglob
опция оболочки для нечувствительного к регистру globbing, и превращает аргумент в шарик путем добавления @()
(который ничему не соответствует и требует 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 версия. Снова, разрешение нечувствительного к регистру завершения является, вероятно, наилучшим вариантом. Следующая установка отступает к нечувствительному к регистру 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
}
inputrc
чтобы это работало. Как это: echo "set completion-ignore-case on" >> ~/.inputrc
– jsejcksn
08.01.2016, 06:10
cd:cd:17: no such file or directory: videos
(Мне назвали dir Videos
)
– Sridhar Sarnobat
22.10.2016, 22:46
emulate -L zsh
кому: emulate -LR zsh
? (По тому, как я просто исправил ошибку, которая должна была быть emulate -L zsh
, нет emulate zsh
, иначе это испортило бы Ваши опции оболочки.)
– Gilles 'SO- stop being evil'
23.10.2016, 02:05