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

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

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

答案1

在某些 shell 中,例如kshzsh,将更改为通过将当前目录的路径名中cd word1 word2第一次出现的 更改为 来指定的目录。word1word2

例如,在zsh外壳中:

$ pwd
/usr/local/sbin
$ cd sbin bin
/usr/local/bin
$

${variable/pattern/replacement}在其他支持最初在 中找到的非标准参数替换的 shell 中ksh93,您可以使用${PWD/word1/word2}创建要更改为的目录的路径名:

$ pwd
/usr/local/sbin
$ cd "${PWD/sbin/bin}"
$ pwd
/usr/local/bin

在这些 shell 中(bash例如, ),您甚至可以创建自己的简单函数来以和的cd方式处理两个参数,如下所示:kshzsh

cd () {
    if [ "$#" -eq 2 ] && [[ $1 != -* ]]; then
        command cd -- "${PWD/$1/$2}" &&
        printf 'New wd: %s\n' "$PWD"
    else
        command cd "$@"
    fi
}

检测[ "$#" -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

请注意,最后一个命令替换为使用匹配直到并包括最后一个/;的模式。必须引用该模式。要禁止模式并始终将第一个参数视为单词,请command cd "${PWD/"$1"/$2}"在函数中使用(注意 的引用$1)。

要另外强制替换仅影响完整的目录名称,请使用command cd "${PWD/"/$1/"/"/$2/"}".在两个参数之前和之后人为地插入/将避免匹配目录名称的子字符串,但会使其与它的工作方式不兼容zshksh并且它不再允许您在目录路径的最后部分进行替换,因为没有/at最后(在额外的“帮助”开始成为障碍之前,你只能提供一定程度的帮助)。

不过,请cd foo bar使用问题中的示例。否则,您必须确保不以其他方式匹配foofoobar例如与cd foo/ bar/.

答案2

这很容易。

cd "$( echo "$PWD" | sed -e 's%/foo/%/bar/%' )"

sed使用命令后面的字符s作为其分隔符。

答案3

在 cli 上,您可以使用如下示例所示的修饰符:

$ mkdir -p foobar/foo/data/images/2020/01/14/0001/
mkdir: created directory 'foobar'
mkdir: created directory 'foobar/foo'
mkdir: created directory 'foobar/foo/data'
mkdir: created directory 'foobar/foo/data/images'
mkdir: created directory 'foobar/foo/data/images/2020'
mkdir: created directory 'foobar/foo/data/images/2020/01'
mkdir: created directory 'foobar/foo/data/images/2020/01/14'
mkdir: created directory 'foobar/foo/data/images/2020/01/14/0001/'
$ ^bar/foo^bar/bar^
mkdir -p foobar/bar/data/images/2020/01/14/0001/
mkdir: created directory 'foobar/bar'
mkdir: created directory 'foobar/bar/data'
mkdir: created directory 'foobar/bar/data/images'
mkdir: created directory 'foobar/bar/data/images/2020'
mkdir: created directory 'foobar/bar/data/images/2020/01'
mkdir: created directory 'foobar/bar/data/images/2020/01/14'
mkdir: created directory 'foobar/bar/data/images/2020/01/14/0001/'

解释:

第一个命令创建以 foobar 开头的嵌套目录。第二个命令使用修饰符 ^ 将前一个命令中的字符串替换为新字符串。输入以下内容很容易出错:

^foo^bar^

但是,这会将命令更改为

mkdir -p barbar/foo/data/images/2020/01/14/0001/

因为它也会影响前导 foo.为了避免这种情况,您可以在预期字符串之前或之后使用一些字符。

我在这个例子中使用了 mkdir,但是 cd 是类似的。 HTH。

答案4

有时使用鼠标更容易,假设您在图形桌面上使用良好的终端模拟器。或者在screen现代等价物中,您可以使用键盘控件来复制/粘贴一些文本。

$ pwd
/some/long/path

将该路径复制/粘贴到cd命令上(即,双击该路径以选择整个路径,如果有空格,则双击该路径以获取整行。如果是这样,则在粘贴之前键入单引号)。

然后使用 shell 的行编辑键来编辑它的早期部分,例如在 Bashemacs模式下,

  • ctrl-a 将光标移动到行首
  • 按 ctrl-右箭头(或 alt-f)几次可按单词前进,直到找到正确的组件。
  • alt-d 或 alt-backspace 向前或向后删除整个单词。
  • 输入替换内容(使用制表符补全)并按回车键

如果你摸索了什么,这只是一个cd命令,所以它不会造成任何破坏性的事情。

相关内容