如何从parent1/suba/subb cd到parent2/suba/subb而不列出子目录?

如何从parent1/suba/subb cd到parent2/suba/subb而不列出子目录?

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

例子:

parent1/suba/subb/
parent2/suba/subb/

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

答案1

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

cd ${PWD/parent1/parent2}

这不必是一个路径组件,它可以是任何子字符串。例如,如果路径实际上是parent1和,并且路径中parent2没有进一步左边的字符,则可以使用。搜索字符串可以包含多个路径组件,但是您需要转义斜杠。例如,要从 到,您可以使用。更准确地说,该部分是 shell 通配符模式,因此您可以编写类似.1cd ${PWD/1/2}~/checkout/trunk/doc/frobnicator/widget~/checkout/bugfix/src/frobnicator/widgetcd ${PWD/trunk\/doc/bugfix/src}parent1cd ${PWD/tr*c/bugfix/src}

桀骜,您可以使用更短的语法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
}

Zsh 提供了第二个参数的补全。在 bash 中实现这一点留给读者作为练习。

答案2

第一次

如果parent1或parent 2位于目录路径中的其他位置。

cd $(pwd | sed -e s:/parent1/:/parent2/: )

那么如果你切换仅有的从这两个目录

cd -
  • 会将您带回您跳转的目录。

答案3

您可以将set目标目录添加到位置数组中。例如:

cd ~
mkdir dirtest
cd dirtest
i=0
until [ "$((i=$i+1))" -gt 9 ] 
do mkdir -p parent"$i"/suba/subb
done

这将创建一棵以问题中的示例为模型的树,其父级为 1-9。我现在可以:

set -- "$PWD/parent"[0-9]"/suba/subb"
cd "$1"; pwd

输出

/home/mikeserv/dirtest/parent1/suba/subb

...并且因为[0-9]全局扩展是根据语言环境排序的...

cd "$5"; pwd

/home/mikeserv/dirtest/parent5/suba/subb

cd "$9"; pwd

/home/mikeserv/dirtest/parent9/suba/subb

...适用于 0-9。但 shell 可能不会排序父级10父9,并且会在之后对其进行排序父级1。然而,它可能会排序父级10家长09, 尽管。一旦达到两位数,您应该使用${parameter expansion}数字周围的大括号来明确引用,"${10}"而不是"$1"then 0

答案4

我的有一个名为(cd-edit).bahsrc的函数。cd-e

cd-e (){  PWD=`echo "$PWD" | vipe +'normal $'`;  cd "$PWD"; }

它在 中打开当前目录vim,光标位于末尾(因为我倾向于在接近末尾的位置进行编辑)。

( Vipe 是 的一部分moreutils,或者类似:

#!/bin/sh
set -e
trap 'rm -f "$tmp"' exit
tmp=`mktemp`
cat > "$tmp"
</dev/tty vi "$@" "$tmp" >/dev/tty
cat "$tmp"

相关内容