2

Интересно, существует ли какая-либо команда (или сценарий) * nix, которая позволяет мне изменять каталоги обратно в папку, соответствующую определенному имени.

Например, представьте, что pwd это:

~/ Рабочее пространство / Рго / ПодПроект / SRC / Основной / Java

Я хочу напечатать что-то вроде:

cd ..proj и мгновенно cd'd обратно в папку proj (вместо того, чтобы вводить cd ../../../../)

PS Имея автозаполнение, такое, что я мог бы сделать: cd ..pr<tab> было бы также здорово.

1 ответ1

3

Не как таковой нет, но вот несколько полезных трюков.

  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
    

    Теперь, если я нахожусь в каталоге ~/ , ввод dir и Tab не будет выполнять автозаполнение, поскольку они находятся в ~/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 . Функция найдет 1-й каталог с именем baz который является подкаталогом любого из ваших текущих каталогов.

    ПРЕДОСТЕРЕЖЕНИЯ:

    1. Он не будет проверять подкаталоги рекурсивно. Например, если вы находитесь в ~/foo/bar/baz/ , pcd foo переместит вас в ../../foo но он не найдет ../bar/foo если такой каталог существует.
    2. Он переместится в 1-й найденный каталог (самый дальний).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .