Altera o diretório para cima para o objetivo especificado

3

Frequentemente estou dentro de uma árvore de diretórios, movendo-me para cima e para baixo para executar várias tarefas. Existe algo mais eficiente do que ir 'cd ../../../..'?

Eu estava pensando em algo do tipo: Se estou em / foo / bar / baz / qux / quux / corge / grault e quero ir para / foo / bar / baz, quero fazer algo como 'cdto baz'. Eu posso escrever algum script bash para isso, mas eu gostaria de saber se já existe de alguma forma.

    
por Haakon 01.06.2010 / 20:49

4 respostas

2

Aqui está uma função que faz o que você quer:

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

Aqui está outro prático:

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
}

Uso:

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 ~)

Eu achei que um dos shells costumava ter o recurso cumulativo dot-dot-dot (cheguei a verificar o Vista agora e não o tinha, embora o Google afirme que algumas versões do Windows o fazem).

Editar

Um recurso não documentado do Bash é que muitos caracteres são aceitáveis em nomes de função. Como resultado, você pode fazer isso:

.. () { cd ..; }
... () { cd ../..; }
.... () { cd ../../..; }
..... () { cd ../../../..; }
    
por 01.06.2010 / 22:30
3

Se você costuma "ir a algum lugar" e depois quer "voltar", pode usar o % de bash pilha de diretórios : pushd para alterar para o diretório específico e popd para voltar de onde você veio.

[/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]$

Caso contrário, ajuste $CDPATH como sugerido por JRobert.

    
por 01.06.2010 / 22:08
2

Faça um CDPATH. Faz para 'cd' o que o PATH faz para encontrar executáveis. De 'man bash':

CDPATH The search path for the cd command. This is a colon-separated list of directories in which the shell looks for destination directories specified by the cd command. A sample value is ".:~:/usr".

    
por 01.06.2010 / 21:57
0

"cd -" volta para o diretório em que você estava por último.

dan@home:/home/dan/ $ cd test/2009/apt/
dan@home:/home/dan/test/2009/apt/ $ cd -
dan@home:/home/dan/ $ 
    
por 01.06.2010 / 22:49