CD para trás na pasta nomeada

2

Queria saber se existe algum comando * nix (ou script) que permita alterar diretórios para trás para uma pasta que corresponda a um determinado nome.

Por exemplo, fingir pwdé:

~ / espaço de trabalho / proj / subproj / src / main / java

Eu quero digitar algo como:

cd ..proje instantaneamente ser cdd de volta para a projpasta. (em vez de precisar digitar cd ../../../../)

PS Ter o preenchimento automático, como eu poderia fazer: cd ..pr<tab>seria incrível também.

Craig Tataryn
fonte
Você pode voltar ao último diretório pwd usando cd -. Talvez isso ajude pelo menos um pouco.
Peter Lamby
@ PeterLamby já sabia desse truque, mas obrigado!
Craig Tataryn
Não existe tal coisa no Bash. Mas, o seu Bash amigável ins embutidos, pushd, popde dirspode ajudá-lo um pouco. Em vez de cd, altere o diretório com pushde, posteriormente, recupere o diretório desejado com o pushd +<num>qual gira a pilha ( dirsgera a pilha de diretórios para você). Para remover diretórios da pilha, use popd.
Sami Laine

Respostas:

3

Não como tal, não, mas aqui estão alguns truques úteis.

  1. Use cd -. Isso o levará ao seu diretório anterior.

  2. Use 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. Use a CDPATHvariável Isso permite que você use o Tabpreenchimento automático de nomes de diretório de qualquer lugar, desde que esses diretórios estejam definidos CDPATH. Por exemplo, digamos que eu tenha um diretório nomeado ~/foocom 4 subdiretórios:

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

    Agora, se eu estiver no ~/diretório, digitando dire Tabnão será preenchido automaticamente porque eles estão abaixo ~/foo. Mas será se eu adicionar ~/fooa CDPATH:

    $ CDPATH="~/foo"
    $ cd dir ## Hit tab here
    dir/   dir1/  dir2/  dir3/  dir4/  
  4. Use uma função que pesquise nos diretórios pai para onde você deseja ir. Basta adicionar estas linhas ao seu ~/.bashrce, em seguida, executar source ~/.bashrcou simplesmente abrir um novo terminal:

    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
    }

    Agora você poderá executar pcd baze será movido para ../../../baz. A função encontrará o 1º diretório nomeado bazque é um subdiretório de qualquer um dos seus diretórios atuais.

    RESSALVAS:

    1. Ele não procurará subdiretórios recursivamente. Por exemplo, se você estiver dentro ~/foo/bar/baz/, pcd fooo moverá para, ../../foomas não encontrará ../bar/foose esse diretório existe.
    2. Ele irá para o primeiro diretório encontrado (o mais distante).
Terdon
fonte
Eu gosto do seu # 4. Eu estava pensando em algo semelhante. Poder-se-ia contornar as advertências se quisessem fazer o esforço. Caramba, alguém poderia subir ainda mais a árvore se quisesse fazer ainda mais esforço.
Keltari
@ Keltari com certeza, você pode usar findtodos os tipos de truques. Só não vale a pena, a menos que o OP especifique exatamente o que eles precisam. Idealmente, você seria apresentado com escolhas entre ../foo/baze ../../bazetc. Isso é mais esforço do que eu estou disposto a gastar agora embora :)
terdon
@terdon # 4 é perfeito, exatamente o que eu quero, na verdade.
Craig Tataryn