我有多个父目录,它们下面具有相同的文件结构。
例子:
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 通配符模式,因此您可以编写类似.1
cd ${PWD/1/2}
~/checkout/trunk/doc/frobnicator/widget
~/checkout/bugfix/src/frobnicator/widget
cd ${PWD/trunk\/doc/bugfix/src}
parent1
cd ${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"
)