如何更改为与不同的低级别父级几乎相同的路径?例如,如果您正在 中 工作并且需要进入相同的路径而不是,那么如何在不输入 的情况下到达那里?当然有一些优雅和/或笨拙的解决方案。~/foobar/foo/data/images/2020/01/14/0001/
bar
foo
cd ~/foobar/bar/data/images/2020/01/14/0001/
答案1
在某些 shell 中,例如ksh
和zsh
,将更改为通过将当前目录的路径名中cd word1 word2
第一次出现的 更改为 来指定的目录。word1
word2
例如,在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
方式处理两个参数,如下所示:ksh
zsh
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/"}"
.在两个参数之前和之后人为地插入/
将避免匹配目录名称的子字符串,但会使其与它的工作方式不兼容zsh
,ksh
并且它不再允许您在目录路径的最后部分进行替换,因为没有/
at最后(在额外的“帮助”开始成为障碍之前,你只能提供一定程度的帮助)。
这会不过,请cd foo bar
使用问题中的示例。否则,您必须确保不以其他方式匹配foo
,foobar
例如与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
命令,所以它不会造成任何破坏性的事情。