A maneira mais rápida de alterar o diretório de / xxxxx / foo / yyyyyy para / xxxxx / bar / yyyyyy

4

Usando o bash, qual é a maneira mais fácil de 'substituir' uma determinada parte do caminho atual por outra coisa? Se meu caminho atual estiver no formato /xxxxx/foo/yyyyy , como posso ir para o diretório /xxxxx/bar/baz/yyyyy com o comando mais curto?

    
por Xavier Nodet 06.01.2011 / 13:45

6 respostas

3

Você pode aproveitar uma função de shell para fornecer essa capacidade conforme necessário:

change() { path='pwd'; cd 'echo $path | sed "s/$1/$2/"'; }

Qual seria chamado de / foo / bar / as:

change "bar" "gazi"

Por favor, note que os "'s não são necessários para este exemplo, mas seriam necessários para strings especiais, como diretórios com caracteres de espaço no nome.

    
por 06.01.2011 / 15:19
3

Não é tão curto, mas funciona: cd ${PWD/foo/bar\/baz}

    
por 06.01.2011 / 13:46
2
cd ../../bar/baz/yyyyy
cd $(echo $PWD | sed 's|foo|bar/baz|')

O segundo parece "mais legal", mas o primeiro é mais curto.

    
por 06.01.2011 / 13:51
2

Em zsh: cd foo bar

No bash: cd 'zsh -ci 'cd foo bar''
que pode ser encurtado para 'zsh -ci 'cd foo bar'' em shopt -s autocd em bash ≥4. Adicione aspas duplas em torno dos backquotes se o resultado for. Isso só funciona se o zsh imprimir um diretório sem ~ abreviações; Como alternativa, zsh -c 'cd foo bar;pwd' imprime um caminho com abreviações, mas começa a ficar comprido.

No bash, você pode escrever um wrapper em torno do cd builtin que emula o comportamento do zsh.

cd () {
  local -a opts
  opts=()
  while [[ $1 = -* ]]; do opts=("${opts[@]}" "$1"); shift; done
  if [[ $# -eq 2 ]]; then
    set -- "${PWD/$1/$2}"
  fi
  if [[ ${#opts[@]} -ne 0 ]]; then
    set -- "${opts[@]}" "$@"
  fi
  builtin cd "$@"
}
    
por 06.01.2011 / 20:12
0

Se você alterou para /xxxxx/foo/yyyyy com cd /xxxxx/foo/yyyyy e deseja alterar diretamente após esse comando para o outro diretório, poderá usar !!:s/foo/bar\/baz/ . O que significa, repita o último comando, mas substitua foo por bar/baz .

Quando você executou alguns comandos entre os dois cd s, você poderia usar !cd:s/foo/bar\/baz/ . O que significa, repita o último comando cd e substitua.

Para mais alguns exemplos e comandos de histórico, dê uma olhada na Referência de Bash Manual .

    
por 06.01.2011 / 14:24
0

Para adicionar esse conceito ao uso do histórico, recomendo analisar os comandos pushd e popd em bash, que pode facilmente alternar entre os diretórios armazenados. O link do blog também é um recurso muito interessante para outros métodos de alternância de diretórios, incluindo comentários sobre como fazer isso dentro de um script.

    
por 06.01.2011 / 17:47

Tags