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

28

Estou lidando com projetos java que geralmente resultam em pastas profundamente aninhadas (/ path / to / project / com / java / lang / whatever, etc) e às vezes quero ser capaz de pular, digamos, 4 níveis de diretório para cima . Digitar cd ../../../ .. é uma dor, e eu não quero ligar simbolicamente. Existe alguma bandeira para cd que permite 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 especificamente para o CD, apenas obtendo a página "builtins" inútil.

    
por Tossrock 16.07.2012 / 21:36

12 respostas

23

Ou ... tente isto: (yay Google)

Navigate up the directory using ..n :

In the example below, ..4 is used to go up 4 directory level, ..3 to go up 3 directory level, ..2 to go up 2 directory level.

Add the following alias to the .bash_profile and re-login.

alias ..="cd .."

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

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

(etc)

Veja Corte # 2

    
por 16.07.2012 / 22:20
19

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 em ~/.bashrc se quiser em todas as instâncias).

É simples de usar:

$ cd.. 10
    
por 01.10.2014 / 07:31
8

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

    
por 25.10.2012 / 23:31
7

Uma solução simples e de baixa tecnologia que não requer configuração. Só funciona em shells com a edição de comandos bash , no entanto.

  • Digite cd ..
  • Pressione Seta para cima Retornar quantas vezes forem necessárias. Muito rápido se você usar dois dedos.
por 20.11.2015 / 15:40
3

Você poderia escrever uma função (tem que ser uma função, já que você quer mudar o estado do 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 vai subir um número de níveis passados como argumento (padrão 1) na estrutura de diretórios física (assim, como 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 assim:

up 4  # equivalent to "cd -P ../../../.."
    
por 13.03.2017 / 16:41
2

Não é exatamente o que você está pedindo, mas você deve procurar pushd e popd . Eu os acho muito mais úteis para navegação de pastas do que alguns cd... alias

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

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'
    
por 26.10.2012 / 00:03
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 arquivo ~/.bashrc o disponibilizará em seu terminal e a criação de uma String ../../../../../../ antes de chamar cd também possibilitará usar 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
}
    
por 12.08.2014 / 10:10
0

Você conhece o autojump ? É uma invasão de terceiros, mas pode ser útil em seu cenário.

    
por 26.10.2012 / 01:26
0

Tente o parâmetro de ambiente raramente usado CDPATH . Então você pode não ter que 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ê pode fazer a configuração do CDPATH em um arquivo de ambiente específico do projeto. E acione-o com um calço para automação adicional.

Eu costumo usar muito pushd e popd. Eu costumo usar o CDPATH para me deixar pular entre árvores do projeto ao invés de subdiretórios em um projeto - mas no momento estou trabalhando em muitos pequenos projetos, não em alguns grandes projetos. :)

    
por 12.08.2014 / 11:09
0

Se você já estiver 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 % 
    
por 20.11.2015 / 15:51
0

Dê uma olhada em DirB . É um script BASH que permite criar marcadores da seguinte forma:

OPERAÇÕES

  • s Salvar um marcador de diretório
  • g vai para um marcador ou diretório nomeado
  • p pressiona um marcador / diretório na pilha de dir.
  • r remover o marcador salvo
  • d exibe o caminho do diretório marcado
  • sl imprime a lista de marcadores de diretório

Muito simples, muito eficaz.

    
por 01.02.2016 / 20:42
0

Aproxime-se da resposta do @ Grigory:

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

Isto é:

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3
    
por 12.01.2017 / 09:26