如何使用不同的低级父级更改为几乎相同的路径?例如,如果您正在工作并且需要到达相同的路径而不是,那么您如何在不输入的情况下到达那里?当然有一些优雅和/或笨拙的解决方案。~/foobar/foo/data/images/2020/01/14/0001/
bar
foo
cd ~/foobar/bar/data/images/2020/01/14/0001/
Kus*_*nda 16
在某些外壳程序中,例如ksh
和zsh
, docd word1 word2
会更改为通过word1
将当前目录的路径名中第一次出现的 更改为 给定的目录word2
。
例如,在zsh
外壳中:
$ pwd
/usr/local/sbin
$ cd sbin bin
/usr/local/bin
$
Run Code Online (Sandbox Code Playgroud)
在其他支持${variable/pattern/replacement}
最初在 中发现的非标准参数替换的shell中ksh93
,您可以使用${PWD/word1/word2}
创建目录的路径名来更改为:
$ pwd
/usr/local/sbin
$ cd "${PWD/sbin/bin}"
$ pwd
/usr/local/bin
Run Code Online (Sandbox Code Playgroud)
在这些炮弹(bash
为例),你甚至可以创建自己的天真cd
函数来处理的方式两个参数是ksh
和zsh
这样做,就像这样:
cd () {
if [ "$#" -eq 2 ] && [[ $1 != -* ]]; then
command cd -- "${PWD/$1/$2}" &&
printf 'New wd: %s\n' "$PWD"
else
command cd "$@"
fi
}
Run Code Online (Sandbox Code Playgroud)
在[ "$#" -eq 2 ]
当特殊检测cd
的行为应该被触发(当恰好有两个命令行参数),但我们测试用[[ $1 != -* ]]
,以不触发特殊行为,如果您使用的选项cd
。在函数内部使用command cd
而不是cd
避免递归调用函数。
测试bash
:
$ cd /usr/local/sbin
$ cd sbin bin
New wd: /usr/local/bin
$ cd local ''
New wd: /usr/bin
$ cd bin sbin
New wd: /usr/sbin
$ cd sbin local/sbin
New wd: /usr/local/sbin
$ cd '*/' /
New wd: /sbin
Run Code Online (Sandbox Code Playgroud)
请注意,最后一个命令使用匹配到并包括最后一个/
;的模式进行替换。必须引用模式。要禁止模式并始终将第一个参数视为单词,请command cd "${PWD/"$1"/$2}"
在函数中使用(注意引用$1
)。
要另外强制替换仅影响完整的目录名称,请使用command cd "${PWD/"/$1/"/"/$2/"}"
. 人工插入/
前两个参数后,将避免匹配目录名的子串,但将使其与方式不兼容这一作品zsh
,并ksh
和它不再让你做出换人的目录路径的最后一部分,因为没有/
在结束(您只能在额外的“帮助”开始成为障碍之前提供一定程度的牵手)。
这会使得cd foo bar
工作与在问题的例子,虽然。否则您必须确保不匹配foo
的foobar
一些其他的方式,例如用cd foo/ bar/
。