在 bash 上有条件地更改路径

在 bash 上有条件地更改路径

当目录可用时,我应该将其更改为“foo”。怎么做?到目前为止,我想出了:

cd `ls | grep foo`

但问题是,如果 grep 不匹配,目录将更改为主目录。

我采用的另一种方法是:

ls -1 | grep foo | xargs -r cd

在此示例中,-r 表示如果没有匹配则不运行该命令。但它不起作用,因为 cd 命令是 shell 内置的,而不是可执行文件。或者类似的东西。

[编辑] 感谢您的回答。如果可能的话,您能否告诉我如何以某种方式将上述功能与 grep 结合起来,以便我可以使用高级正则表达式?

答案1

这将仅对目录进行操作,如果没有找到目录,它将停留在同一目录中:

cdg () {
    cd $(ls -d */ | grep "$1" || echo .)
}

如果多个目录匹配,它将变为列表中的第一个目录。

答案2

试试这个怎么样?

test -d foo && cd foo

然后您可以将其作为函数放在 .bashrc 或类似文件中:

# conditional cd, use as follows:
# ccd some_dir
function ccd {
    test -d "$1" && cd "$1"
}

要使用 grep 而不是简单的 test -d,请使用以下命令(请注意,您可以使用另一个 grep,或根据需要添加标志):

# conditional regex-cd
functino rccd {
    if has_dir=`ls |egrep "$1"`; then cd $has_dir; fi
}

// 已编辑以匹配更新的问题。

答案3

if [[ -d foo ]]; then
  cd foo
fi

-d表示“文件存在并且是目录。” 这是在 man bash 的“条件表达式”部分。

相关内容