通过更改路径名中的一个早期单词来更改目录

Fru*_*ngi 10 shell cd-command

如何使用不同的低级父级更改为几乎相同的路径?例如,如果您正在工作并且需要到达相同的路径而不是,那么您如何在不输入的情况下到达那里?当然有一些优雅和/或笨拙的解决方案。~/foobar/foo/data/images/2020/01/14/0001/barfoocd ~/foobar/bar/data/images/2020/01/14/0001/

Kus*_*nda 16

在某些外壳程序中,例如kshzsh, 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函数来处理的方式两个参数是kshzsh这样做,就像这样:

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工作与在问题的例子,虽然。否则您必须确保不匹配foofoobar一些其他的方式,例如用cd foo/ bar/