将Bash CD放到特定文件夹中


16

我在Magento做很多工作,所以和我一起工作的很多人也在做,不得不输入以下内容很烦人:

cd ../../../../../../

为了仅从根目录“ httpdocs”文件夹中找到几个目录,因此我尝试制作一个遵循此伪代码的脚本:

while lowest level directory != httpdocs
    cd ../
end while;

看起来很简单,我假设我必须做某种形式的grep检查当前工作目录的最后一部分是否是httpdocs,如果不是一直保持到真正的水平的话。

我一直在为此目的学习bash,尽管似乎已经有一些类似的东西,而且语法使我无休止。

Answers:


8

这必须是shell函数,而不是脚本,因为脚本在新的shell中执行(因此无法更改原始shell的目录)。

function cdroot()
{
  while [[ $PWD != '/' && ${PWD##*/} != 'httpdocs' ]]; do cd ..; done
}

当然,您可以随意命名该函数。

一些解释:如果不在httpdocs文件夹中,则第一个测试($PWD != '/')是故障保护cdroot。扎根后它将停止。

第二个测试(${PWD##*/} != 'httpdocs')有点复杂。 $PWD是一个包含当前目录路径的变量。${PWD##*/}修剪所有内容,直到最后一个斜杠为止。


这种迭代的缺点是,您失去了做事cd -后才能回到原来位置的能力。
Ezequiel Muns 2013年

27

我的upto.bashrc中有一个函数,该函数可让您按名称转到当前路径上的任何目录:

upto ()
{
    if [ -z "$1" ]; then
        return
    fi
    local upto=$1
    cd "${PWD/\/$upto\/*//$upto}"
}

我也有此功能的完成,因此当我点击tab时,它会给我有效的目录名称和完成:

_upto()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local d=${PWD//\//\ }
    COMPREPLY=( $( compgen -W "$d" -- "$cur" ) )
}
complete -F _upto upto

此外,我还有另一个功能jd,可让我跳至当前目录下的任何目录:

jd(){
    if [ -z "$1" ]; then
        echo "Usage: jd [directory]";
        return 1
    else
        cd **"/$1"
    fi
}

例:

[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto h[TAB][TAB]
habitat       hippopotamus
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto hippopotamus
[/www/public_html/animals/hippopotamus] $ jd images
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ 

您还可以为添加别名upto httpdocs
cjm 2011年

@drogbane:jd并非在每种情况下都有效,您介意解释一下它的工作原理吗?
塞萨尔(Cesar)2012年

@Cesar使用globstar(**)。要在bash shell中启用此功能,请使用shopt -s globstar
dogbane 2012年

2
如此出色地完成了,希望我能投票两次。
2013年

1
我在jd函数中包括了动态购物车检测和激活,请参阅gist.github.com/Rob--W/5888648。我只用Bash 4.2.45进行了测试,所以是YMMV。
罗伯W

5

.bashrc可以想到的最简单的bash函数(之所以简单,是因为它不使用循环或外部进程)是:

cdup() {
    cd "${PWD/\/httpdocs\/*//httpdocs}"
}

这使用Pattern替换参数扩展将/httpdocs/in 之后的所有内容替换$PWD为`/ httpdocs'。看起来非常混乱,因为我们必须在路径中转义正斜杠以使其与bash扩展语法中的正斜杠区分开。另外,不要在替换字符串中转义正斜杠,因此它看起来也不一致。

如果/httpdocs/当前路径中没有任何内容,则将不执行任何替换,它将替换为当前目录。

例如,替换将替换/a/b/c/httpdocs/e/f/g/a/b/c/httpdocscd进入该目录。

该功能必须位于当前的shell环境中(作为功能或别名),因为子进程无法更改其父目录的当前目录。这就是为什么我说要把它放在您的.bashrc而不是shell脚本中的原因。


顺便提一句,值得一提的是,这将使您在层次结构中尽可能地高(这可能是最有用的用例)。
易卜拉欣2012年

3

您也可以在个人资料中输入以下内容:

alias cdh='cd $(echo $PWD | sed -e "s/\(.*\/httpdocs\)\/.*/\1/")'

只需键入即可cdh将您转到httpdocs当前路径中的最顶层目录。


2

它不能完全解决您的问题,但是可以节省一些时间cd ../../../../../../。我从这里的user unknown帖子中借来的。


最多N

在目录树中向上跳转N个目录

不用打字

cd ../../../..

你只要输入

up 4

还有一个

cd -    

会带你回来

将该函数放入您的.bashrc中以使用它。

# (c) 2007 stefan w. GPLv3          
function up {
ups=""
for i in $(seq 1 $1)
do
        ups=$ups"../"
done
cd $ups
}
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.