CD para trás para a pasta nomeada

2

Gostaria de saber se existe algum comando (ou script) * nix que me permita mudar os diretórios para trás, para uma pasta que corresponda a um determinado nome.

Por exemplo, finja que pwd é:

~/workspace/proj/subproj/src/main/java

Eu quero digitar algo como:

cd ..proj e instantaneamente retornará o cd para a pasta proj . (em vez de digitar cd ../../../../ )

P.S. Ter o Autocomplete, de modo que eu poderia fazer: cd ..pr<tab> seria incrível também.

    
por Craig Tataryn 20.05.2014 / 16:52

1 resposta

3

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

  1. Use cd - . Isto irá levá-lo 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 variável CDPATH . Isso permite usar a Tab para preencher automaticamente nomes de diretórios de qualquer lugar, desde que esses diretórios estejam definidos em CDPATH . Por exemplo, digamos que eu tenha um diretório chamado ~/foo com 4 subdiretórios:

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

    Agora, se eu estiver no diretório ~/ , digitar dir e a Guia não serão preenchidos automaticamente porque estão abaixo de ~/foo . Mas será que se eu adicionar ~/foo a CDPATH :

    $ CDPATH="~/foo"
    $ cd dir ## Hit tab here
    dir/   dir1/  dir2/  dir3/  dir4/  
    
  4. Use uma função que pesquise os diretórios pais para onde você deseja ir. Basta adicionar essas linhas ao seu ~/.bashrc e, em seguida, executar source ~/.bashrc ou apenas 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 baz e será movido para ../../../baz . A função encontrará o primeiro diretório chamado baz , que é um subdiretório de qualquer um dos seus diretórios atuais.

    CAVEATS:

    1. Ele não verificará os subdiretórios recursivamente. Por exemplo, se você estiver em ~/foo/bar/baz/ , pcd foo moverá você para ../../foo , mas não encontrará ../bar/foo se esse diretório existir.
    2. Irá para o 1º diretório encontrado (o que estiver mais acima).
por 20.05.2014 / 23:26

Tags