更改目录(cd),但仅替换部分路径


14

不确定是否可行,但是我似乎记得从前使用AIX时可以通过仅说出路径的哪一部分需要用其他东西代替来更改路径。例如,假设我有两条路径:

/etc/application-2.0.1/options/default

/etc/application-1.0.8/options/default

我可以使用类似的命令从文件夹1切换到2

cd /2.0.1/1.0.8/

这将取代,路径,字符串2.0.11.0.8。显然,这对我现在不起作用。但是有办法吗?

Answers:


11

如果将zsh用作shell,则只需输入即可cd 1.0.8 2.0.1


对我来说,这似乎是最好的选择。现在寻找如何安装该东西:)
nathanvda

1
sudo apt-get install zsh
koushik 2010年

1
RandomMonkey的答案允许Bash的内置“ cd”中具有完整的路径替换功能。
kmarsh

9

这应该在bash运行在Ubuntu 10.04: cd ${PWD/old/new}。基本上,这将替换第一次出现old在你当前的工作目录new。下面的2个示例。

例子1

ing02741@hoster:~$ cd /home/ing02741/Videos/
ing02741@hoster:~/Videos$ cd ${PWD/ing02741/koushik}
ing02741@hoster:/home/koushik/Videos$ 

例子2

ing02741@hoster:~/src/cdtest$ mkdir dir-v1.0.1 dir-v2.2.2 dir-v3.0.7
ing02741@hoster:~/src/cdtest$ mkdir dir-v1.0.1/ind dir-v2.2.2/ind dir-v3.0.7/ind
ing02741@hoster:~/src/cdtest$ cd dir-v1.0.1/ind/
ing02741@hoster:~/src/cdtest/dir-v1.0.1/ind$ cd ${PWD/1.0.1/2.2.2}
ing02741@hoster:~/src/cdtest/dir-v2.2.2/ind$ 

借用上面的sepp2k的想法,您可以制作一个像这样的函数

function mycd { cd ${PWD/$1/$2} }

然后使用类似mycd 2.0.1 1.0.8开关的方法。


1
这是那里的1/2路。如果您查看RandomMonkey的答案,您会发现内置的Bash Cd可能具有全部功能。
kmarsh

8

我本人已使用(并错过了)此功能。这取决于您使用的* nix的风味和/或版本。如果使用bash,这是扩展内置cd以包括此功能的便捷方法。将此放入您的.bashrc中(或进行测试以将其粘贴到您的bash shell中,然后按Enter键)。

function cd() { if [ $# -eq 2 ]; then builtin cd ${PWD/$1/$2}; else builtin cd $1; fi }

7

您可能会想起历史扩展。我不知道您在AIX上的Shell中有什么可用,但是在bash中执行此操作的一种方法是^2.0.1^1.0.8

对于具有强大命令行编辑功能的bash和zsh这样的shell,历史记录扩展不太有用。您可以使用箭头键来调用先前的命令,并使用Alt+ .插入先前命令的最后一个单词(按两次以到达之前的命令,依此类推)。


如果打开的histverify选项,shopt则只需第二次按Enter 。
暂停,直到另行通知。

@丹尼斯:谢谢,我--norc在测试时忘记了。
吉尔斯(Gillles)“所以-别再作恶了”

3

如果您是vi迷,则可以在shell中启用vi模式(例如bash set -o vi),然后使用vi的命令模式...

或者您可以进行疯狂的历史扩展(在zsh中进行过测试,也许也在bash中进行了测试):

$ cd /etc/application-1.0.8/options/default
cd: no such file or directory: /etc/application-1.0.8/options/default

$ !!:s/1.0.8/2.0.1/
cd /etc/application-2.0.1/options/default
cd: no such file or directory: /etc/application-2.0.1/options/default

顺便说一句,在bash中对其进行了测试,它也可以正常运行。
maxschlepzig

3
cd `pwd | sed 's/2\.0\.1/1\.0\.8/'`

但是,这不是很漂亮。您可以通过将其放在函数中来对其进行修饰:

function mycd { cd `pwd | sed s$1` }

然后像这样调用它:

mycd '/2\.0\.1/1.0.8/'

不过,您仍然需要避开这些点,但是我敢肯定,只要稍加思考,就可以解决此问题。


您当然不需要逃脱替换右侧的点。在大多数情况下,除非您有很多类似名称的文件夹,否则不要转义左侧的点也是无害的。
frabjous


2

为确保-P|-L|-工作,请使用以下命令:

function cd () {
    typeset arg=
    case $1 in -|-L|-P) arg=$1 ; shift ;; esac
    [ $# -gt 1 ] && {
        builtin cd $arg "${PWD/$1/$2}"
    } || {
        builtin cd $arg "$@"
    }
}

1

不确定AIX,但是我记得这是我用来管理的Solaris机器上的一个古老的Korn Shell技巧。在您的示例中,您将键入以下命令:

cd 2.0.1 1.0.8

一些更多的信息在这里


这对我不起作用:ubuntu 10.04,bash“ GNU bash,版本4.1.5(1)-发行版(i486-pc-linux-gnu)”,我尝试了以下命令:2048 cd 2049 cd〜/ src / local -ubuntu补丁/cdtest/dir-v1.0.9/gnome-control-center-2.30.1/capplets/network/ 2050 cd dir-v1.2.9 dir-v1.0.9 / home / ing02741 / src / local-ubuntu- patchs / cdtest / dir-v1.2.9 / gnome-control-center-2.30.1 / capplets / network是有效路径。
koushik 2010年

@koushik:他写道这是一个Korn shell技巧。您正在使用bash。bash!=光荣。在Ubuntu下,可以通过软件包“ ksh”获得ksh。
maxschlepzig

哎呀,我不好。对不起,我忽略了这一点。@maxschlepzig-感谢您指出。
koushik 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.