Usando cd para subir vários níveis de diretório

39

Estou lidando com projetos java que geralmente resultam em pastas profundamente aninhadas (/ path / to / project / com / java / lang / etc) e às vezes quero saltar, digamos, 4 níveis de diretório para cima. Digitar cd ../../../ .. é uma dor, e eu não quero vincular. Existe algum sinalizador para cd que permita subir vários níveis de diretório (na minha cabeça, seria algo como cd -u 4)? Infelizmente, não consigo encontrar nenhuma página de manual para o cd especificamente, apenas obtendo a página "builtins" inútil.

Tossrock
fonte
11
Modificando o bash para interpretar cd ...onde o número de '.' seria o número de níveis para subir. Isso causaria um conflito do qual não estou ciente?
Para aqueles que vêm aqui para o MacOS, você pode instalar zshe Oh My Zshqual é a melhor alternativa bashe, em seguida, pode fazer cd ...(vários pontos) como deveria ser
Dominic

Respostas:

29

Ou ... tente o seguinte: (yay Google)

Navegue até o diretório usando ..n:

No exemplo abaixo, ..4 é usado para subir 4 níveis de diretório, ..3 para subir 3 níveis de diretório, ..2 para subir 2 níveis de diretório.

Adicione o alias a seguir ao .bash_profile e faça login novamente.

alias .. = "cd .."

alias ..2 = "cd ../ .."

alias ..3 = "cd ../../ .."

(etc)

Ver Corte # 2

cutrightjm
fonte
10
Prefiro usar os aliases .., ...e ....como eles são mais rápidos de digitar, mas o princípio dos aliases é o mesmo, é claro.
Bernhard
11
@bernhard Você é mais que bem-vindo, pois não acredito que possa causar conflitos. Acabei de deixá-lo como está, porque o citei no site.
Cutrightjm 16/07/2012
O shell 4DOS.EXE para DOS também suporta cd ..., cd ....etc. Foi muito útil.
Alexs
..... não é mais rápido que ..4, na verdade, é 2 caracteres mais lento ..
Ryan
29

Uma função simples, com um alias também:

function cd_up() {
  cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'

(Você pode definir isso ~/.bashrcse quiser em todas as instâncias).

É simples de usar:

$ cd.. 10
Grigory K
fonte
Agradável! Funciona para mim! Bash 4.3.11
Carlos Nunez
2
Boa resposta; você pode querer salientar que este é melhor do que soluções como o eval $(printf "cd ..;%.s" $(seq $1))que cdvárias vezes, porque ~-aka $OLDPWDestá definido para o diretório de trabalho de antes invocação, ao invés de um diretório intermediário. PS - simplifica para cd $(printf %.s../ $(seq "$1"))se você quiser.
Toby Speight
10

Uma solução simples e de baixa tecnologia que não precisa de configuração. Só funciona em shells com bashedição de comandos -style.

  • Tipo cd ..
  • Pressione Up-arrow Returnquantas vezes for necessário. Muito rápido se você usar dois dedos.
Tom Zych
fonte
2
haha, não uma resposta ruim eu acho :)
joshmcode
8

Acontece que a resposta correta é 'cd + n', onde n é o número de níveis que você deseja subir. Pena que isso não está documentado em qualquer lugar!

Tossrock
fonte
17
pelo menos, NÃO funciona no bash.
HongboZhu 26/03
5
Não funciona no bash 4.2.25, como fornecido com o Debian. Por curiosidade, que * nix e / ou shell você está usando?
Alexios
O Bash tem um chamado dirsinterno que usa [+ n] como argumento e imprime o enésimo diretório exclusivo que foi adicionado via pushd. Se você alias cdpara pushd, em seguida, você pode usar este. No entanto, observe que essa não é tecnicamente uma resposta à pergunta do OP, porque isso tem a ver com diretórios exclusivos , o que significa que o pedido fica confuso ao longo do tempo, à medida que você retorna aos mesmos diretórios.
Brian Peterson
Sim, pushde popdtambém use uma opção [+ n], e é por isso que isso pode funcionar. Além disso, embora seja imperfeito e indireto, acho que isso pode ser usado como resposta à pergunta. Muitas vezes, você visitou os diretórios acima recentemente, para que estejam nos últimos 10 diretórios armazenados pela pilha de diretórios.
Brian Peterson
não funcionou para mim ...
Vass
4

Você pode escrever uma função (ela deve ser uma função, pois você deseja alterar o estado do seu próprio shell, ou seja, o diretório de trabalho; um comando externo afetaria apenas seu próprio processo).

Aqui está uma função que subirá vários níveis passados ​​como argumento (padrão 1) na estrutura do diretório físico (assim cd -P .., n vezes):

up() {
    # default parameter to 1 if non provided
    declare -i d=${@:-1}
    # ensure given parameter is non-negative. Print error and return if it is
    (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1;
    # remove last d directories from pwd, append "/" in case result is empty
    cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/";
}

Use-o assim:

up 4
mgild
fonte
11
Embora esse código possa responder à pergunta, fornecer um contexto adicional a respeito de por que e / ou como esse código responde à pergunta melhora seu valor a longo prazo.
Donald Duck
11
Concordo, adicionei alguns comentários para ajudar.
mgild
Ser nitpicky, não é up 4realmente equivalente a cd /some/dir/assumir $PWD = "/some/dir/that/is/deeply/nested/"?
snapfractalpop
2

Não é exatamente o que você está pedindo, mas você deve procurar pushde popd. Acho-os muito mais úteis para a navegação de pastas do que alguns cd...apelidos

Se você estiver indo e voltando de algumas áreas fixas, o normal é ter aliases.

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'
Rich Homolka
fonte
1

Em vez de usar aliases, você também pode usar a seguinte função bash:

function mcd() {
  up=""

  for ((i=1; i<=$1;i++)); do
    up="${up}../"
  done

  cd $up
}

(ou como uma linha: function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; })

Adicionar isso ao seu ~/.bashrcarquivo o tornará disponível no seu terminal e a construção de uma String ../../../../../../antes da chamada cdtambém possibilitará o uso cd -para voltar ao diretório inicial.

Uma implementação mais útil também pode conter algumas verificações de entrada do usuário:

function mcd() {
    if [[ $1 -lt 1 ]]; then
        echo "Only positive integer values larger than 1 are allowed!" >&2
        echo -e "\n\tUsage:\n\t======\n\n\t\t# to go up 10 levels in your directory\n\t\tmcd 10\n\n\t\t# to go up just 2 levels\n\t\tmcd 2\n" >&2
        return 1;
    fi  

    up=""

    for ((i=1; i<=$1;i++)); do
        up="${up}../"
    done

    cd $up
}
Quem se importa
fonte
0

Você conhece o autojump ? É um hack de terceiros, mas pode ser útil no seu cenário.

AnonymousLurker
fonte
0

Experimente o parâmetro de ambiente raramente usado CDPATH. Talvez você não precise definir explicitamente o nível.

Exemplo:

$ find workspace -type d
workspace
workspace/project1
workspace/project1/com
workspace/project1/com/java
workspace/project1/com/java/lang

$ CDPATH=".:~/workspace:~/workspace/project1:~/workspace/project1/com:~/workspace/project1/com/java:~/workspace/project1/com/java/lang"
$ cd com
$ pwd
~/workspace/project1/com

Se estiver trabalhando em vários projetos, você poderá transformar a configuração CDPATH em um arquivo de ambiente específico do projeto. E ative-o com um calço para automação adicional.

Eu costumo usar pushd e popd bastante. Costumo usar o CDPATH para me deixar saltar entre as árvores do projeto, em vez de subdividir-se em um projeto - mas, no momento, estou trabalhando em muitos projetos pequenos, não em alguns grandes. :)

JezC
fonte
0

Se você já estava no diretório de destino:

luna:/tmp % mkdir -p a/b/c/d
luna:/tmp % pwd
/tmp
luna:/tmp % cd a/b/c/d
luna:d % pwd
/tmp/a/b/c/d
luna:d % cd -
luna:/tmp % pwd
/tmp
luna:/tmp % 
masm
fonte
0

Dê uma olhada no DirB . É um script BASH que permite criar indicadores da seguinte maneira:

OPERAÇÕES

  • s Salvar um marcador de diretório
  • g vá para um marcador ou diretório nomeado
  • p coloque um marcador / diretório na pilha de diretórios
  • r remover favorito salvo
  • d exibir o caminho do diretório marcado como favorito
  • sl imprime a lista de favoritos do diretório

Muito simples, muito eficaz.

rseal
fonte
0

Afaste-se da resposta de @ Grigory:

function cd_up() {
if [ -z "$1" ]; then
    cd ..
else
    cd $(printf "%0.s../" $(seq 1 $1 ))
fi
}
alias 'cdd'='cd_up'

Isso é :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3
qun
fonte
0

Fiquei cansado desse mesmo problema e acabei escrevendo o cd-plus como resultado. Um utilitário de CLI de arquivo único que permite criar vários diretórios.

Uso

echo `pwd` # /foo/bar/foobar/baz/foobaz/bazfoo
d baz

echo `pwd` # /foo/bar/
Kevin S Lin
fonte
0

Adicionar o código abaixo à sua .bashrcextensão estenderá cdpara honrar a notação de três pontos

_cd_dot_expansion() {
    local path="${COMP_WORDS[COMP_CWORD]}"

    if [[ "${path}" =~ ^\.{3,} ]]; then
        local dots="${BASH_REMATCH}"
        local levels="${#dots}"
        local tail="${path##*...}"
        local expanded_dots='..'

        # the loop starts at two because the first set of dots is
        # assigned to `expanded_dots` when it is initialized
        for (( i = 2; i < "${levels}"; i++ )); do
            expanded_dots+='/..'
        done

        path="${expanded_dots}${tail}"
        COMPREPLY=( $( compgen -A file "${path}" ) )

        return
    fi

    _cd
}

complete -o nospace -F _cd_dot_expansion cd

Depois que esse snippet for executado no seu shell bash, a digitação cd .../e a batida <TAB>completarão o caminho ../../e listarão os caminhos relativos de todos os diretórios que estão dois níveis acima, por exemplo.

Atualização : bash-completiondeve ser instalado para ter acesso ao _cdmétodo mencionado no código acima. É instalável através da maioria dos gerenciadores de pacotes de linha de comando

Grant Humphries
fonte