Como posso cd de parent1 / suba / subb para parent2 / suba / subb sem listar subdiretórios?

4

Eu tenho vários diretórios pai com a mesma estrutura de arquivo abaixo deles.

Exemplo:

parent1/suba/subb/
parent2/suba/subb/

Quando estou em parent1/suba/subb , gostaria de mudar para parent2/suba/subb sem fazer algo como cd ../../../parent2/suba/subb . Como posso fazer isso sem listar todos os subdiretórios e ../ s?

    
por stiemannkj1 25.09.2014 / 19:28

6 respostas

5

Você pode usar a PWD variable e expansão de parâmetros é construída para aplicar rapidamente uma transformação de texto ao diretório atual.

cd ${PWD/parent1/parent2}

Isso não precisa ser exatamente um componente de caminho, pode ser qualquer substring. Por exemplo, se os caminhos forem literalmente parent1 e parent2 e não houver nenhum caractere 1 restante no caminho, você poderá usar cd ${PWD/1/2} . A cadeia de pesquisa pode conter vários componentes de caminho, mas você precisa escapar da barra. Por exemplo, para ir de ~/checkout/trunk/doc/frobnicator/widget a ~/checkout/bugfix/src/frobnicator/widget , você pode usar cd ${PWD/trunk\/doc/bugfix/src} . Mais precisamente, a parte parent1 é um padrão de caractere curinga, para que você possa escrever algo como cd ${PWD/tr*c/bugfix/src} .

Em zsh , você pode usar a sintaxe mais curta cd parent1 parent2 . Novamente, você pode substituir qualquer substring no caminho (aqui, isso é exatamente uma substring, não um padrão curinga).

Você pode implementar uma função semelhante no bash.

cd () {
  local options
  options=()
  while [[ $1 = -[!-]* ]]; do options+=("$1"); shift; done
  if (($# == 2)); then
    builtin cd "${options[@]}" "${PWD/$1/$2}"
  else
    builtin cd "${options[@]}" "$@"
  fi
}

Zsh fornece conclusão para o segundo argumento. Implementar isso na bash é deixado como um exercício para o leitor.

    
por 26.09.2014 / 02:40
1

primeira vez

se pai1 ou pai2 estiver em outro lugar no caminho do diretório.

cd $(pwd | sed -e s:/parent1/:/parent2/: )

se você mudar somente desses dois diretórios

cd -
  • o levará de volta ao diretório de onde você pula.
por 25.09.2014 / 20:41
1

Você pode set dos diretórios de destino para a matriz posicional. Por exemplo:

cd ~
mkdir dirtest
cd dirtest
i=0
until [ "$((i=$i+1))" -gt 9 ] 
do mkdir -p parent"$i"/suba/subb
done

Isso cria uma árvore modelada após o exemplo na pergunta, com os pais 1-9. Agora posso:

set -- "$PWD/parent"[0-9]"/suba/subb"
cd "$1"; pwd

OUTPUT

/home/mikeserv/dirtest/parent1/suba/subb

... e porque a expansão [0-9] glob é classificada de acordo com a localidade ...

cd "$5"; pwd

/home/mikeserv/dirtest/parent5/suba/subb

cd "$9"; pwd

/home/mikeserv/dirtest/parent9/suba/subb

... funciona para 0-9. Mas o shell provavelmente não classificará parent10 depois de parent9 e, em vez disso, o classificará depois de parent1 . No entanto, provavelmente irá ordenar parent10 depois de parent09 . Assim que chegar em dois dígitos, você deve usar as chaves ${parameter expansion} ao redor do número para referenciar explicitamente "${10}" em vez de "$1" , em seguida, 0 .

    
por 26.09.2014 / 03:41
0

Uma maneira de fazer isso é usar pwd e sed para substituir as diferenças no caminho da seguinte forma:

cd 'pwd | sed 's/parent1/parent2/''

ou assim:

cd $( pwd | sed 's/parent1/parent2/' )

Em alguns casos (como no exemplo), você não precisa especificar o diretório inteiro, e você pode simplesmente substituir as partes diferentes:

cd 'pwd | sed 's/1/2/''
    
por 25.09.2014 / 19:29
0

Meu .bahsrc tem uma função chamada cd-e (edição de cd).

cd-e (){  PWD='echo "$PWD" | vipe +'normal $'';  cd "$PWD"; }

Ele abre o diretório atual em vim , com o cursor posicionado no final (porque tenho a tendência de editar mais perto do final).

( O Vipe faz parte do moreutils , ou algo parecido:

#!/bin/sh
set -e
trap 'rm -f "$tmp"' exit
tmp='mktemp'
cat > "$tmp"
</dev/tty vi "$@" "$tmp" >/dev/tty
cat "$tmp"

    
por 20.10.2015 / 02:30
-1

A maneira mais fácil e mais comum de fazer isso é usar um alias:

alias dir1='cd parent1/suba/subb/' 
    
por 26.09.2014 / 21:07