我有多个父目录,它们下面有相同的文件结构。
例子:
parent1/suba/subb/
parent2/suba/subb/
Run Code Online (Sandbox Code Playgroud)
当我在的时候parent1/suba/subb
,我想改为parent2/suba/subb
不做类似的事情cd ../../../parent2/suba/subb
。如何在不列出所有子目录和../
s 的情况下执行此操作?
您可以使用PWD
变量和参数扩展结构快速将文本转换应用到当前目录。
cd ${PWD/parent1/parent2}
Run Code Online (Sandbox Code Playgroud)
这不必完全是路径组件,它可以是任何子字符串。例如,如果路径字面上是parent1
和parent2
,并且路径中没有1
进一步留下字符,则可以使用cd ${PWD/1/2}
. 搜索字符串可以包含多个路径组件,但是您需要对斜杠进行转义。例如,要从~/checkout/trunk/doc/frobnicator/widget
到~/checkout/bugfix/src/frobnicator/widget
,您可以使用cd ${PWD/trunk\/doc/bugfix/src}
。更准确地说,该parent1
部分是一个 shell 通配符模式,因此您可以编写类似cd ${PWD/tr*c/bugfix/src}
.
在zsh 中,您可以使用较短的语法cd parent1 parent2
。同样,您可以替换路径中的任何子字符串(这里,这正是一个子字符串,而不是通配符模式)。
您可以在 bash 中实现类似的功能。
cd () {
local options
options=()
while [[ $1 = -[!-]* ]]; do options+=("$1"); shift; done
if (($# == 2)); then
builtin cd "${options[@]}" "${PWD/$1/$2}"
else
builtin cd "${options[@]}" "$@"
fi
}
Run Code Online (Sandbox Code Playgroud)
Zsh 为第二个参数提供补全。在 bash 中实现这一点留给读者作为练习。