KornShell(ksh)曾经为cd
提供了一个非常有用的选项来遍历类似的目录结构;例如,给出以下目录:
/home/sweet/dev/projects/trunk/projecta/app/models
/home/andy/dev/projects/trunk/projecta/app/models
然后,如果您在/home/sweet...
目录中,则可以通过键入
cd sweet andy
因此,如果ksh看到2个参数,那么它将扫描当前目录路径中的第一个值,将其替换为第二个值并在那里cd。有人知道Bash内置了类似的功能吗?或者如果没有,那么让Bash以同样的方式工作的黑客攻击?
答案 0 :(得分:5)
到目前为止提供的其他解决方案存在以下一个或多个问题:
/canis/lupus/lupus/
或/nicknames/Robert/Rob/
此版本处理上面列出的所有问题。
cd ()
{
local pwd="${PWD}/"; # we need a slash at the end so we can check for it, too
if [[ "$1" == "-e" ]]
then
shift
# start from the end
[[ "$2" ]] && builtin cd "${pwd%/$1/*}/${2:-$1}/${pwd##*/$1/}" || builtin cd "$@"
else
# start from the beginning
[[ "$2" ]] && builtin cd "${pwd/\/$1\///$2/}" || builtin cd "$@"
fi
}
从以下目录中发布任何其他版本,我称之为 cdX
:
/canis/lupus/lupus/specimen $ cdX lupus familiaris bash: cd: /canis/familiaris/lupus/specimen: No such file or directory如果“狼疮”的第二个实例是预期的那个,则
失败。为了适应这种情况,您可以使用“-e
”选项来从目录结构的开始。
/canis/lupus/lupus/specimen $ cd -e lupus familiaris /canis/lupus/familiaris/specimen $
或从这一个发出其中一个:
/nicknames/Robert/Rob $ cdX Rob Bob bash: cd: /nicknames/Bobert/Rob: No such file or directory
会无意中替换字符串的一部分。我的函数通过在匹配中包含斜杠来处理它。
/nicknames/Robert/Rob $ cd Rob Bob /nicknames/Robert/Bob $
你也可以像这样明确地指定一个目录:
/fish/fish/fins $ cd fish/fins robot/fins /fish/robot/fins $
顺便说一句,我在我的函数中使用了控件操作符&&
和||
,而不是if
... then
... else
。 .. fi
只是为了变化。
答案 1 :(得分:3)
cd "${PWD/sweet/andy}"
答案 2 :(得分:2)
Michał Górny's替换表达式效果很好。要重新定义内置cd命令,请执行以下操作:
cd () {
if [ "x$2" != x ]; then
builtin cd ${PWD/$1/$2}
else
builtin cd "$@"
fi
}