如何在不列出子目录的情况下从 parent1/suba/subb cd 到 parent2/suba/subb?

sti*_*kj1 4 bash cd-command

我有多个父目录,它们下面有相同的文件结构。

例子:

parent1/suba/subb/
parent2/suba/subb/
Run Code Online (Sandbox Code Playgroud)

当我在的时候parent1/suba/subb,我想改为parent2/suba/subb不做类似的事情cd ../../../parent2/suba/subb。如何在不列出所有子目录和../s 的情况下执行此操作?

Gil*_*il' 5

您可以使用PWD变量参数扩展结构快速将文本转换应用到当前目录。

cd ${PWD/parent1/parent2}
Run Code Online (Sandbox Code Playgroud)

这不必完全是路径组件,它可以是任何子字符串。例如,如果路径字面上是parent1parent2,并且路径中没有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 中实现这一点留给读者作为练习。