如何让 `cd dir/filename` 带我到 dir/?

如何让 `cd dir/filename` 带我到 dir/?

我发现能够cd文件争论。

cd myDirectory/anyname.anyExtension 将相当于 cd myDirectory/

实现此行为的最佳别名或函数是什么?

编辑:抱歉我一开始没有提到它:我使用zsh

答案1

我假设如果您输入一个目录并且您正在使用bash.

cd() {
    local file="${!#}"

    if (( "$#" )) && ! [[ -d "$file" ]]; then
        builtin cd "${@:1:($#-1)}" "${file%/*}"
    else
        builtin cd "$@"
    fi
}

如果您永远不会使用 cd 的选项(-P等),那么这也足够了:

cd() { 
    if [ -d "$1" ] || [ -z "$1" ]; then
        builtin cd "$@"
    else
        builtin cd "${1%/*}"
    fi
}

答案2

您可以使用dirname从路径中删除文件名,例如

mycd() { cd "$(dirname "$1")"; }

man dirname

答案3

在 中zsh,我经常这样做:

cd /path/to/somefile(:h)

h为了head)。

如果somefile是符号链接,您还可以这样做:

cd somefile(:A:h)

到达可以找到符号链接目标的目录。


zsh克里斯现在唯一的解决方案相当于bash

cd() {
  [[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
  builtin cd "$@"
}

在 中zsh,您还可以重新定义“单词”Ctrl-W删除的内容。

在 中zsh,基于单词的运动/转置/删除小部件上下文中的“单词”是alnums 序列加上变量中的字符,$WORDCHARS默认情况下包括/

您可以删除/from$WORDCHARS以便Ctrl-W仅删除一个路径组件:

WORDCHARS=${WORDCHARS/\/}

另一个有用的扩展是select-word-style小部件,您可以使用它在不同的文字样式之间进行交互选择。

autoload select-word-style
zle -N select-word-style
bindkey '\ew' select-word-style

然后按Alt-W可以让您在不同的文字样式之间进行选择。

$ cd /blah/blih<Alt-W>
Word styles (hit return for more detail):
(b)ash (n)ormal (s)hell (w)hitespace (d)efault (q)uit
(B), (N), (S), (W) as above with subword matching
?

答案4

cd2() {
 arg=() dir= cmd= IFS=" " msg='[-L|[-P [-e]]|-h] [dir|file]'

 while [ "$#" -gt 1 ] ; do
  case "$1" in
   -h) printf "%s: cd2 %s\n" "$0" "$msg"
    return 1 ;;
   *) arg+=("$1") ;;
  esac
  shift
 done

 [ -f "${1:-}" ] && dir="$(dirname ${1:-})" || dir="${1:A}"
 [ ! -z "$arg" ] && cmd="cd ${arg[@]} $dir" || cmd="cd $dir"

 if ! $cmd 2>/dev/null; then
  printf "%s: cd2 %s\n" "$0" "$msg"
  return 1
 fi
}

相关内容