Comment rendre les arguments de type cd INsensitive?

Parfois, lors de l'access aux différents directorys, il arrive la plupart du time que je me souvienne des noms ou au less une partie des noms d'un directory sous notre système Linux. Mais certains des directorys sont nommés en commençant par les premiers caractères ou l'un des caractères au milieu du nom Majuscule.

Quelqu'un peut-il suggérer comment puis-je faire les arguments suivant le cas de command cd INSENSITIVE, de sorte que si cd BackupDirectory ou cd backupdirectory il pourrait entrer le nom du directory BackupDirectory.

Bien sûr, je ne veux pas visser les choses pour les autres users, donc si cela est possible, est-ce possible que le changement pourrait être appliqué uniquement à la session que j'utilise et n'affecte pas les autres users?

Ok, j'ai essayé set completion-ignore-case mais cela ne fonctionne tout simplement pas. Cela aide simplement que si je tape cd b et Tab ou Esc Esc, il remplit le nom du directory en ignorant le cas. Mais, ce dont j'ai besoin, c'est si je fais un cd backupdirectory , il ignore simplement le cas et entre dans BackupDirectory seul.

L'activation de cdspell aidera à:

 shopt -s cdspell 

De la page de manuel:

cdspell Si cette option est activée, les erreurs mineures dans l'orthographe d'un composant de directory dans une command cd seront corrigées. Les erreurs vérifiées sont des caractères transposés, un caractère manquant et un caractère trop nombreux. Si une correction est trouvée, le nom du file corrigé est imprimé et la command continue. Cette option est uniquement utilisée par les shells interactifs.

Frapper

set completion-ignore-case on dans ~/.inputrc (ou bind 'set completion-ignore-case on' dans ~/.bashrc ) serait ma recommandation. Si vous allez taper le nom complet, pourquoi reculer à quelques pressions de la touche Maj ?

Mais si vous le voulez vraiment, voici un wrapper autour de cd qui essaie une correspondance exacte, et s'il n'y en a pas, search une correspondance insensible à la casse et l'exécute si elle est unique. Il utilise l'option de shell nocaseglob les nocaseglob insensibles à la casse et transforme l'argument en glob en ajoutant @() (qui ne correspond à rien et nécessite extglob ). L'option extglob doit être activée lors de la définition de la fonction, sinon bash ne peut même pas l'parsingr. Cette fonction ne prend pas en charge 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

Pendant que j'y suis, voici une fonction similaire pour ksh93. Le ~(i) modifié pour l'appariement insensible à la casse semble être incompatible avec le suffixe / pour faire correspondre uniquement les directorys (ceci peut être un bug dans ma version de ksh). J'utilise donc une stratégie différente pour éliminer les non-directorys.

 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

Enfin, voici une version zsh. Encore une fois, permettre l'achèvement insensible à la casse est probablement la meilleure option. Le réglage suivant revient à la segmentation insensible à la casse s'il n'y a pas de correspondance exacte:

 zstyle ':completion:*' '' matcher-list 'm:{az}={AZ}' 

Supprimer '' pour afficher toutes les correspondances insensibles à la casse même s'il existe une correspondance exacte. Vous pouvez le définir à partir de l'interface de menu de 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 }