可以CD成文件吗?

Is it possible to CD into a file?

我找到了我需要 cd 到(显然到父目录)的文件列表。

如果我这样做 cd ./src/components/10-atoms/fieldset/package.json,我会得到错误 cd: not a directory:,这是有道理的。

但是没有办法允许这样做吗?因为操作路径字符串非常麻烦,对我来说,有一个选项是完全有意义的,因为 cd 是一个目录函数,如果路径不会在文件中结束,那就太好了,它会递归地跳得更高,并从给定的路径中找到“第一个目录”。

所以 cd ./src/components/10-atoms/fieldset/package.json 会让我进入 ./src/components/10-atoms/fieldset/ 而不会紧张,告诉我我选择了一个文件而不是目录。

如果您输入更长的行(或创建专用的 shell 脚本)就可以

cd $(dirname ./src/components/10-atoms/fieldset/package.json)

如果在脚本中添加它可以是:

cd $(dirname )

但是你需要这样执行:

. script_name ./src/components/10-atoms/fieldset/package.json

您可以编写一个 shell 函数来完成它。

cd() {
    local args=() arg

    for arg in "$@"; do
        if [[ $arg != -* && -e $arg && ! -d $arg ]]; then
            args+=("$(dirname "$arg")")
        else
            args+=("$arg")
        fi
    done

    builtin cd ${args[0]+"${args[@]}"}
}

如果您希望它成为默认行为,请将其放入您的 ~/.bashrc。它不会被 shell 脚本或其他程序继承,因此它们不会受到影响。

它修改了cd的参数,用父目录替换任何文件名。带有前导破折号的选项将被保留。 command cd 调用底层 cd 内置函数,这样我们就不会陷入递归循环。

(这是什么邪恶的野兽:${args[0]+"${args[@]}"}?就像"${args[@]}",它扩展了参数数组,但它避免在关闭时触发a bash bug with empty arrays您的 bash 版本可能是 4.0-4.3 并且您启用了 set -u。)

这个函数应该可以满足您的需求:

cdd() { test -d "" && cd "" || cd $(dirname "") ; }

如果它的第一个参数 "" 是一个目录,只需 cd 进入它, 否则 cd 进入包含它的目录。

应改进此功能以考虑特殊文件,例如设备或符号链接。

你可以把这个函数放在你的 ~/.bashrc:

function ccd() {
    TP=                    # destination you're trying to reach
    while [ ! -d $TP ]; do   # if $TP is not a directory:
        TP=$(dirname $TP)   # remove the last part from the path
    done                    # you finally got a directory
cd $TP                       # and jump into it
}

用法:ccd /etc/postfix/strangedir/anotherdir/file.txt 会让你到达 /etc/postfix