更改目录至指定目标

更改目录至指定目标

我经常深入目录树,上下移动以执行各种任务。有没有比“cd ../../../..”更有效的方法?

我当时的想法是这样的:如果我在 /foo/bar/baz/qux/quux/corge/grault 中,并且想要转到 /foo/bar/baz,我想执行类似“cdto baz”的操作。我可以为此编写一些 bash 脚本,但我首先想知道它是否已经以某种形式存在。

答案1

这是一个可以完成您想要的操作的函数:

cdto () { cd "${PWD%/$1/*}/$1"; }

这是另一个方便的方法:

c2 () {
        local path num
    if (($# != 0))
    then
        path='./'
    fi
    if [[ -z ${1//.} ]]
    then
        num=${#1}
    elif [[ -z ${1//[[:digit:]]} ]]
    then
        num=$1
    else
        echo "Invalid argument"
        return 1
    fi
    for ((i=0; i<num-1; i++))
    do
        path+='../'
    done
    cd $path
}

用法:

c2 .    # same as cd .
c2 ..   # same as cd ..
c2 ...  # same as cd ../..
c2 3    # also same as cd ../..
c2      # same as cd (which is the same as cd ~)

我认为其中一个 shell 曾经具有累积的点点点功能(我刚刚检查了 Vista,它没有此功能,尽管 Google 声称某些版本的 Windows 有此功能)。

编辑

Bash 的一个未公开的功能是,函数名中可以接受很多字符。因此,你可以这样做:

.. () { cd ..; }
... () { cd ../..; }
.... () { cd ../../..; }
..... () { cd ../../../..; }

答案2

如果你经常“去某处”然后想“回去”,你可以使用bash's目录堆栈pushd更改到特定目录并popd返回原来的位置。

[/tmp]$ mkdir -p some/deep/directory/tree
[/tmp]$ pushd some/deep/directory/tree
/tmp/some/deep/directory/tree /tmp

[/tmp/some/deep/directory/tree]$ pushd ..
/tmp/some/deep/directory /tmp/some/deep/directory/tree /tmp

[/tmp/some/deep/directory]$ popd
/tmp/some/deep/directory/tree /tmp

[/tmp/some/deep/directory/tree]$ popd
/tmp

[/tmp]$

否则,$CDPATH按照 JRobert 的建议进行调整。

答案3

创建一个 CDPATH。它对“cd”的作用与 PATH 对查找可执行文件的作用相同。从“man bash”开始:

CDPATH cd 命令的搜索路径。这是一个以冒号分隔的目录列表,shell 在其中查找 cd 命令指定的目标目录。示例值为“.:~:/usr”。

答案4

“cd -” 返回您上次所在的目录。

dan@home:/home/dan/ $ cd test/2009/apt/
dan@home:/home/dan/test/2009/apt/ $ cd -
dan@home:/home/dan/ $ 

相关内容