CD 向后移动到指定文件夹

CD 向后移动到指定文件夹

想知道是否存在任何 *nix 命令(或脚本)允许我将目录向后更改到与特定名称匹配的文件夹。

例如,假装pwd是:

〜/工作区/项目/子项目/ src / main / java

我想要输入类似以下内容的内容:

cd ..proj并立即返回到该proj文件夹​​。(而不必键入cd ../../../../

PS:有了自动完成功能,我就可以这样做:cd ..pr<tab>这也太棒了。

答案1

当然不是,但是这里有一些有用的技巧。

  1. 使用cd -。这会将您移动到上一个目录。

  2. 使用pushd

    $ pushd foo/bar/baz/foobar/babar/
    /home/terdon/foo/bar/baz/foobar/babar
    ~/foo/bar/baz/foobar/babar ~
    $ pwd
    /home/terdon/foo/bar/baz/foobar/babar
    $ pushd ~/foo/
    ~/foo ~/foo/bar/baz/foobar/babar ~
    $ pushd +1
    ~/foo/bar/baz/foobar/babar ~ ~/foo
    $ pwd
    /home/terdon/foo/bar/baz/foobar/babar
    
  3. 使用CDPATH变量。这允许您使用Tab从任何地方自动完成目录名称,只要这些目录在中定义即可CDPATH。例如,假设我有一个名为 的目录,~/foo其中包含 4 个子目录:

    $ tree
    .
    ├── dir1
    ├── dir2
    ├── dir3
    └── dir4
    

    现在,如果我在目录中~/,输入dirTab将不会自动完成,因为它们在下~/foo。但是如果我添加~/foo到,它就会自动完成CDPATH

    $ CDPATH="~/foo"
    $ cd dir ## Hit tab here
    dir/   dir1/  dir2/  dir3/  dir4/  
    
  4. 使用搜索父目录的功能来查找要去的地方。只需将这些行添加到您的目录中~/.bashrc,然后运行source ~/.bashrc或打开一个新终端:

    find_target(){
        ## The target directory
        _target=$1
        ## Iterate through the parent directories
        printf "%s\n" "$PWD" | sed -r 's#/#/\n#g' |
        while read parent_dir; 
        do
            ## Check if the target directory exists under this
            ## parent directory and if it does, print the
            ## target's path and break the loop.
            _path="${_path}${parent_dir}"
            [ -d "${_path}${_target}" ] && echo "${_path}${_target}" && break
        done
    }
    
    ## If the value passed as an argument to
    ## this function exists as a subdirectory of
    ## any of the current directory's parents, 
    ## cd into it. Else, fail silently.
    pcd(){
        cd "$(find_target $1)" 2>/dev/null
    }
    

    现在您就可以运行pcd baz,并且您将被移动到../../../baz。该函数将找到名为 的第一个目录baz,它是您当前任何目录的子目录。

    注意事项:

    1. 它不会递归检查子目录。例如,如果您位于~/foo/bar/baz/pcd foo则会将您移动到../../foo​​,但它不会查找../bar/foo是否存在这样的目录。
    2. 它将移动到找到的第一个目录(最上面的目录)。

相关内容