如何使用不同的低级父级更改为几乎相同的路径?例如,如果您正在工作并且需要到达相同的路径而不是,那么您如何在不输入的情况下到达那里?当然有一些优雅和/或笨拙的解决方案。~/foobar/foo/data/images/2020/01/14/0001/barfoocd ~/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/。
| 归档时间: |
|
| 查看次数: |
607 次 |
| 最近记录: |