使用cd上移多个目录级别


39

我正在处理Java项目,这些项目经常导致深度嵌套的文件夹(/ path / to / project / com / java / lang / whatever等),有时希望能够向上跳4个目录级别。键入cd ../../../ ..很痛苦,我不想建立符号链接。cd是否有一些标志可以让您进入多个目录级别(在我看来,这类似于cd -u 4)?不幸的是,我找不到专门用于cd的任何手册页,而只是获得了无用的“内置”页面。


1
修改bash以解释cd ...“。”的位置 将是要上升的级别数。这会导致我不知道的冲突吗?

对于那些即将在这里使用MacOS的用户,您可以安装它zshOh My Zsh它是一个更好的选择bash,然后您可以cd ...像应该做的那样(多个点)进行操作
Dominic

Answers:


29

或者...试试这个:(是Google)

使用..n浏览目录:

在下面的示例中,.. 4用于向上4个目录级别,.. 3用于向上3个目录级别,.. 2用于向上2个目录级别。

将以下别名添加到.bash_profile并重新登录。

别名.. =“ cd ..”

别名..2 =“ cd ../ ..”

别名..3 =“ cd ../../ ..”

(等等)

参见Hack#2


10
我宁愿使用别名.........为他们更快地打字,但别名的原理是一样的,当然。
Bernhard

1
@bernhard非常欢迎您加入,因为我认为这不会引起任何冲突。我只是按原样保留它,因为我从网站上引用了它。
cutrightjm 2012年

DOS的4DOS.EXE shell也受支持cd ...cd ....等等。它非常方便。
Alexios

.....不小于..4快,其实这是2个字符慢..
瑞恩

29

一个带有别名的简单函数:

function cd_up() {
  cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'

~/.bashrc如果需要,可以在每个实例中定义它)。

使用简单:

$ cd.. 10

好东西!为我工作!Bash 4.3.11
Carlos Nunez

2
好答案; 你可能想指出的是,这是不是解决办法更好,比如eval $(printf "cd ..;%.s" $(seq $1))cd多次,因为~-又名$OLDPWD从之前调用设置工作目录,而不是中间目录。PS- cd $(printf %.s../ $(seq "$1"))如果需要,它可以简化为。
Toby Speight

10

一个简单,技术含量低的解决方案,无需任何设置。但是,仅在使用bash-style命令编辑的shell中有效。

  • 类型 cd ..
  • Up-arrow Return根据需要按多次。如果使用两个手指,则速度非常快。

2
哈哈,我想这不是一个不好的答案:)
joshmcode

8

原来正确的答案是“ cd + n”,其中n是您要上升的级别数。太糟糕了,这在任何地方都没有记录!


17
至少它在bash中不起作用。
2013年

5
在Debian附带的bash 4.2.25上不起作用。出于好奇,您正在使用什么* nix和/或shell?
Alexios

Bash有一个名为dirs[+ n] 的内置调用,并显示通过添加的第n个唯一目录pushd。如果您alias cdpushd,则可以使用此功能。但是,请注意,从技术上讲,这不是OP的问题的答案,因为这与唯一目录有关,这意味着当您返回相同目录时,顺序会随着时间而混乱。
Brian Peterson

是啊,pushd而且popd还采取了[+ n]选项,这就是为什么能工作。另外,尽管它是不完美和间接的,但我想这可以用作问题的答案。您最近经常访问您上面的目录,因此它们将位于目录堆栈存储的最后10个目录中。
Brian Peterson

没为我工作...
Vass 2016年

4

您可以编写一个函数(它必须是一个函数,因为您要更改外壳程序本身的状态,即工作目录;外部命令仅会影响其自身的进程)。

这是一个函数,它将在物理目录结构中(例如cd -P ..n次)上升为参数(默认为1)传递的多个级别:

up() {
    # default parameter to 1 if non provided
    declare -i d=${@:-1}
    # ensure given parameter is non-negative. Print error and return if it is
    (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1;
    # remove last d directories from pwd, append "/" in case result is empty
    cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/";
}

像这样使用它:

up 4

1
尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以提高其长期价值。
唐老鸭

1
同意,我添加了一些评论来提供帮助。
mgild

挑剔,up 4真的不等于cd /some/dir/假设$PWD = "/some/dir/that/is/deeply/nested/"吗?
snapfractalpop

2

不完全是您的要求,但您应该调查pushdpopd。我发现它们比一些cd...别名对文件夹导航更有用

如果要从几个固定区域来回移动,通常的事情是使用别名。

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'

1

除了使用别名,您还可以使用以下bash函数:

function mcd() {
  up=""

  for ((i=1; i<=$1;i++)); do
    up="${up}../"
  done

  cd $up
}

(或作为一衬垫:function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; }

将其添加到~/.bashrc文件中将使其在终端中可用,并且../../../../../../在调用之前构建String cd还将使您可以使用它cd -跳回到起始目录。

一个更有用的实现可能还包含一些用户输入检查:

function mcd() {
    if [[ $1 -lt 1 ]]; then
        echo "Only positive integer values larger than 1 are allowed!" >&2
        echo -e "\n\tUsage:\n\t======\n\n\t\t# to go up 10 levels in your directory\n\t\tmcd 10\n\n\t\t# to go up just 2 levels\n\t\tmcd 2\n" >&2
        return 1;
    fi  

    up=""

    for ((i=1; i<=$1;i++)); do
        up="${up}../"
    done

    cd $up
}


0

尝试使用很少使用的环境参数CDPATH。然后,您可能不必显式设置级别。

例:

$ find workspace -type d
workspace
workspace/project1
workspace/project1/com
workspace/project1/com/java
workspace/project1/com/java/lang

$ CDPATH=".:~/workspace:~/workspace/project1:~/workspace/project1/com:~/workspace/project1/com/java:~/workspace/project1/com/java/lang"
$ cd com
$ pwd
~/workspace/project1/com

如果在多个项目上工作,则可以将CDPATH设置设置为项目特定的环境文件。并使用垫片触发它以实现额外的自动化。

我倾向于大量使用push和popd。我倾向于使用CDPATH让我在项目树之间而不是项目的子目录中进行跳转-但目前,我正在处理许多小型项目,而不是一些大型项目。:)


0

如果您以前位于目标目录中:

luna:/tmp % mkdir -p a/b/c/d
luna:/tmp % pwd
/tmp
luna:/tmp % cd a/b/c/d
luna:d % pwd
/tmp/a/b/c/d
luna:d % cd -
luna:/tmp % pwd
/tmp
luna:/tmp % 

0

看一眼 DirB。这是一个BASH脚本,可让您创建书签,如下所示:

操作方式

  • s保存目录书签
  • g转到书签或命名目录
  • p将书签/目录推送到目录堆栈
  • r删除保存的书签
  • d显示书签的目录路径
  • sl打印目录书签列表

很简单,很有效。


0

远离@Grigory的答案:

function cd_up() {
if [ -z "$1" ]; then
    cd ..
else
    cd $(printf "%0.s../" $(seq 1 $1 ))
fi
}
alias 'cdd'='cd_up'

那是 :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3

0

厌倦了这个完全相同的问题,结果写了cd-plus。一个文件CLI实用程序,可让您安装多个目录。

用法

echo `pwd` # /foo/bar/foobar/baz/foobaz/bazfoo
d baz

echo `pwd` # /foo/bar/

0

将以下代码添加到您的代码中,.bashrc将扩展cd的完成以表示三个加号标记

_cd_dot_expansion() {
    local path="${COMP_WORDS[COMP_CWORD]}"

    if [[ "${path}" =~ ^\.{3,} ]]; then
        local dots="${BASH_REMATCH}"
        local levels="${#dots}"
        local tail="${path##*...}"
        local expanded_dots='..'

        # the loop starts at two because the first set of dots is
        # assigned to `expanded_dots` when it is initialized
        for (( i = 2; i < "${levels}"; i++ )); do
            expanded_dots+='/..'
        done

        path="${expanded_dots}${tail}"
        COMPREPLY=( $( compgen -A file "${path}" ) )

        return
    fi

    _cd
}

complete -o nospace -F _cd_dot_expansion cd

在您的bash shell中运行此代码段后,例如,键入cd .../和命中<TAB>将完成指向../../两个目录的所有目录的路径并列出其相对路径。

更新bash-completion必须安装才能访问_cd上面的代码中引用的方法。可通过大多数命令行程序包管理器安装

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.