cd dois níveis abaixo da raiz

2

Sou um desenvolvedor web (principalmente o Drupal). Quando desenvolvo websites, faço isso em uma pasta / workspace.

Portanto, tenho pastas como esta.

/workspace/project/
/workspace/project/sites/default/files/
/workspace/project1/
/workspace/project1/sites/all/modules/contrib/date

Eu gostaria de ter um comando que me leve ao meu projeto raiz, que é sempre

/workspace/something/

Então, quando eu estiver em:

/workspace/project/sites/default/files/

[specialcdcommand] vai me levar para:

/workspace/project/

Mas quando estou em:

/workspace/project1/sites/default/files/

[specialcdcommand] vai me levar para:

/workspace/project1/

No momento, tenho a tendência de fazer isso:

cd /workspace/p[tab]

... o que não é bom porque às vezes chego a uma versão de projeto diferente sem perceber.

Se isso ajudar, eu uso o zsh.

    
por mcaleaa 03.02.2014 / 10:16

4 respostas

3
specialcdcommand() cd ${(M)PWD#/*/*/}

Ou:

specialcdcommand() cd ${${(M)PWD#/*/*/}:?Not deep enough}

ou:

specialcdcommand() cd "${(M)PWD#/*/*/}"

para evitar ir ao seu diretório pessoal se você ainda não tiver ultrapassado dois níveis.

Em zsh , o sinalizador de expansão variável (M) altera o comportamento do operador ${var#pattern} , de modo que a sequência atiada M é expandida em vez de ser removida. :? é o operador padrão / Bourne para retornar um erro (e cancelar o comando) se uma variável se expandir para uma cadeia vazia. Observe que zsh é o único shell que possui uma maneira consistente de expandir os parâmetros de aninhamento.

POSIXly:

specialcdcommand() {
  p=${PWD#/*/*/}
  [ "$p" = "$PWD" ] || cd "${PWD%"$p"}"
}

Ou para evitar a alteração da variável $p :

specialcdcommand() {
  set -- "${PWD#/*/*/}"
  [ "$1" = "$PWD" ] || cd "${PWD%"$p"}"
}
    
por 03.02.2014 / 11:12
2

Isto irá mudar o diretório para o segundo diretório externo (ele deve funcionar em qualquer shell POSIX, desde que os nomes de arquivos e diretórios não contenham caracteres de nova linha):

descend() {
    IFS=/ read -r x root project x << EOF
$PWD
EOF
    cd "/${root:+$root/$project}"
}

Funciona dividindo o caminho (primeira linha do) em seus componentes, retirando os nomes das raízes e dos projetos e reunindo-os novamente.

Se você precisasse estendê-lo indefinidamente, você poderia usar a opção (não portátil) -a para read , que cria uma matriz.

    
por 03.02.2014 / 10:38
1

Primeiro, você precisa garantir que está em um diretório de projeto. Eu sugiro esta função:

function cdproot (){
    CURRENT='pwd'
    [[ $CURRENT == /workspace/* ]] && echo "Going to project home.." || ( echo "Not in a project subfolder" ; return 1 )
    PROOT='echo $CURRENT | awk -F\/ '{print "/"$2"/"$3}''
    cd "$PROOT" && return 0;
}

Por favor, adicione-o ao seu arquivo ~/.bashrc

    
por 03.02.2014 / 10:54
0

Eu diria:

cd "/'pwd|cut -d"/" -f2,3'"

crie um script e inclua esta linha dentro. As aspas permitem usar espaço ou tab no nome do arquivo.
Ele não funcionará com pasta contendo espaço.

Você pode integrá-lo ao seu arquivo .zshrc profile assim:

function prjroot(){
    cd "/'pwd|cut -d"/" -f2,3'" && return 0;
}  

Além disso, se você estiver em um nível primário como /opt /usr , não fará nada.

    
por 03.02.2014 / 10:43