Como posso ir a um diretório em uma determinada profundidade na árvore atual?

1

Eu geralmente trabalho em várias pastas ( dev1 , dev2 e dev3 ) no mesmo servidor. A estrutura da pasta é algo como:

  • /var/www/html/dev1/a/b/c/d/e/f
  • /var/www/html/dev2/a/b/c/d/e/f
  • /var/www/html/dev3/a/b/c/d/e/f

Quando estou em uma pasta, digamos c ou d ou e de /var/www/html/dev3/ , existe um comando que me levará à /var/www/html/dev3/a ?

O mesmo comando deve me levar a /var/www/html/dev1/a se eu executar o comando da pasta c ou d ou e de /var/www/html/dev1/ .

    
por Gokul N K 09.07.2015 / 13:36

4 respostas

2

Esse é um trabalho para uma função. Supondo que seu shell seja bash, você pode definir uma função em seu .bashrc . A função estará disponível na próxima vez que você começar o bash.

cdwww () {
  …
}

O que deve ser o ? Um comando cd , certamente. O caminho para o diretório atual está na variável PWD e você pode usar processamento de strings e outras construções.

Por exemplo, a seguinte função vai para o diretório acima do diretório atual, logo abaixo de /var/www/html , se o diretório atual estiver sob /var/www/html .

cdwww () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    cd "${PWD%"$d"}"
  else
    echo 1>&2 "$0: not under a web root"
    return 3
  fi
}

Você pode fazer essa função aceitar um caminho para um subdiretório diferente de /var/www/html/dev*/a .

cdwww () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    cd "${PWD%"$d"}/$1"
  else
    echo 1>&2 "$0: not under a web root"
    return 3
  fi
}

Uma abordagem diferente seria definir uma variável para o diretório de destino sempre que você alterasse os diretórios. O código a seguir organiza a execução da função chpwd sempre que o diretório atual é alterado.

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    html_root="${PWD%"$d"}"
  else
    unset html_root
  fi
}

Então você pode usar cd $html_root (ou apenas $html_root se você ativou shopt -s autocd ).

    
por 13.07.2015 / 02:19
4

Método 1 - cd's relativos

O método mais fácil de subir uma certa profundidade de onde você está é fazer este comando:

$ pwd
/Users/sammingolelli/adir/dev3/a/b/c/d/e/f

$ cd ../../../../..

$ pwd
/Users/sammingolelli/adir/dev3/a

Método 2 - pushd / popd

Além disso, você também pode usar pushd e popd , que atua como uma pilha, mantendo um FIFO ou os diretórios que você informa ao usar pushd para ir aos diretórios e popd para retornar para o diretório anteriormente empurrado na pilha.

Exemplo
$ pwd
/Users/sammingolelli/adir/dev3/a
$ dirs
~/adir/dev3/a

$ pushd b/c/d/e/f/
~/adir/dev3/a/b/c/d/e/f ~/adir/dev3/a
$ pwd
/Users/sammingolelli/adir/dev3/a/b/c/d/e/f

$ popd
~/adir/dev3/a
$ pwd
/Users/sammingolelli/adir/dev3/a

Método 3 - aliases

Você também pode criar um alias para fazer o que quiser. Isso é abordado em vários Q & A's que já estão no site, ou veja a resposta de @fastrizwaan.

Método # 4 - CDPATH

Veja essa resposta em @manatwork , neste Q & A: Navegação rápida no diretório .

Mais, usando uma ferramenta?

Os dois métodos acima são os que normalmente usam para se movimentar. Existem, é claro, ferramentas adicionais que você pode instalar e que funcionam como ferramentas de navegação. Muitas dessas ferramentas foram discutidas neste site. Um que vem à mente funciona como uma ferramenta de bookmarking, que permite "marcar" um diretório específico e mapeá-lo para um nome curto, para que você possa facilmente alterá-lo de onde quer que esteja.

autojump

Uma dessas ferramentas eu discuto neste Q & A intitulado: Como criar um caminho curto? . A ferramenta é chamada de autojump .

outros

Há também outras que foram sugeridas neste Q & A intitulado: Navegação rápida no diretório .

    
por 09.07.2015 / 14:16
1

Agora eu entendi sua pergunta:

cd $(pwd|cut -c 1-18)/a

levará você para /var/www/html/dev1/a quando estiver abaixo ou em dev1 e para /var/www/html/dev2/a quando estiver abaixo ou em dev2 e assim por diante.

cut parece ser um hack aqui e você muda o 18 quando seus pathes mudam, mas eu não encontrei uma solução mais elegante usando o regex.

    
por 09.07.2015 / 18:08
-1

Eu acho que você quer aliases para o diretório: coloque isso no final do seu .bashrc se você quiser permanentemente.

alias cd1a='cd /var/www/html/dev1/a/'
alias cd2a='cd /var/www/html/dev2/a/'
alias cd3a='cd /var/www/html/dev3/a/'

alias cd1b='cd /var/www/html/dev1/a/b'
alias cd2b='cd /var/www/html/dev2/a/b'
alias cd3b='cd /var/www/html/dev3/a/b'

assim você pode fazer isso para os outros.

apenas execute cd1a para ir para / var / www / html / dev1 / a / de qualquer diretório.

    
por 09.07.2015 / 14:23