alterar diretório (cd), mas substituindo apenas uma parte do caminho

14

Não tenho certeza se é possível, mas eu me lembro dos velhos tempos usando o AIX, era possível mudar meu caminho dizendo apenas qual parte do caminho precisava ser substituída por outra coisa. Por exemplo, digamos que eu tenha dois caminhos:

/etc/application-2.0.1/options/default

e

/etc/application-1.0.8/options/default

que eu poderia mudar da pasta 1 para 2 usando um comando como

cd /2.0.1/1.0.8/

que substituiria, no caminho, a string 2.0.1para 1.0.8. Obviamente, isso não funciona para mim agora. Mas existe uma maneira de fazer isso?

nathanvda
fonte

Respostas:

11

Se você usar o zsh como shell, basta entrar cd 1.0.8 2.0.1.

qbi
fonte
Esta parece ser a melhor opção para mim. Agora, olhando como instalar essa coisa :)
nathanvda
1
sudo apt-get install zsh
koushik
1
A resposta do RandomMonkey permite a funcionalidade de substituição de caminho completo no "cd" interno do Bash.
kmarsh
9

Isso deve funcionar no bash no Ubuntu 10.04: cd ${PWD/old/new}. Basicamente, isso substitui a primeira ocorrência de oldno seu diretório de trabalho atual por new. 2 exemplos abaixo.

Exemplo 1

ing02741@hoster:~$ cd /home/ing02741/Videos/
ing02741@hoster:~/Videos$ cd ${PWD/ing02741/koushik}
ing02741@hoster:/home/koushik/Videos$ 

Exemplo 2

ing02741@hoster:~/src/cdtest$ mkdir dir-v1.0.1 dir-v2.2.2 dir-v3.0.7
ing02741@hoster:~/src/cdtest$ mkdir dir-v1.0.1/ind dir-v2.2.2/ind dir-v3.0.7/ind
ing02741@hoster:~/src/cdtest$ cd dir-v1.0.1/ind/
ing02741@hoster:~/src/cdtest/dir-v1.0.1/ind$ cd ${PWD/1.0.1/2.2.2}
ing02741@hoster:~/src/cdtest/dir-v2.2.2/ind$ 

Tomando emprestado a idéia do sepp2k acima, você poderia fazer uma função como esta

function mycd { cd ${PWD/$1/$2} }

e depois use algo parecido mycd 2.0.1 1.0.8com o switch.

koushik
fonte
1
Isto é 1/2 caminho até lá. Se você olhar para a resposta do RandomMonkey, verá que a funcionalidade completa é possível no Bash Cd interno.
kmarsh
8

Eu mesmo usei (e perdi) esse recurso. Depende de qual sabor e / ou versão do * nix você está usando. Se você usa o bash, aqui está uma maneira prática de estender o cd interno para incluir essa funcionalidade. Coloque isso no seu .bashrc (ou, para testar, cole-o no shell bash e pressione enter).

function cd() { if [ $# -eq 2 ]; then builtin cd ${PWD/$1/$2}; else builtin cd $1; fi }
RandomMonkey
fonte
7

Você provavelmente está se lembrando da expansão da história. Não sei o que estava disponível no seu shell no AIX, mas uma maneira de fazer isso no bash é ^2.0.1^1.0.8.

A expansão do histórico é menos útil em shells como o bash e o zsh que possuem poderosa edição de linha de comando. Você pode usar as teclas de seta para recuperar os comandos anteriores e Alt+ .para inserir a última palavra do comando anterior (pressione duas vezes para acessar o comando anterior e assim por diante).

Gilles 'SO- parar de ser mau'
fonte
Você só precisa pressionar enter pela segunda vez se a histverifyopção de shoptestiver ativada.
Pausado até novo aviso.
@ Dennis: obrigado, eu tinha esquecido --norcdurante o teste.
Gilles 'SO- stop be evil'
3

Se você é um fã do vi, pode ativar o modo vi no seu shell (bash set -o vi por exemplo) e usar o modo de comando do vi ...

Ou você pode fazer uma expansão louca do histórico (testado no zsh, talvez também no bash):

$ cd /etc/application-1.0.8/options/default
cd: no such file or directory: /etc/application-1.0.8/options/default

$ !!:s/1.0.8/2.0.1/
cd /etc/application-2.0.1/options/default
cd: no such file or directory: /etc/application-2.0.1/options/default
maxschlepzig
fonte
Aliás, testei no bash e funciona lá também.
maxschlepzig
3
cd `pwd | sed 's/2\.0\.1/1\.0\.8/'`

No entanto, isso não é muito bonito. Você pode melhorar um pouco, colocando-o em uma função:

function mycd { cd `pwd | sed s$1` }

E então chamando assim:

mycd '/2\.0\.1/1.0.8/'

No entanto, você ainda precisa escapar dos pontos, mas tenho certeza de que isso também pode ser resolvido com um pouco de reflexão.

sepp2k
fonte
Você certamente não precisa escapar dos pontos no lado direito da substituição. Na maioria dos casos, não escapar dos pontos à esquerda também será inofensivo, a menos que você tenha muitas pastas com nomes semelhantes.
Frabjous
3
 ^2.0.1^1.0.8 

O comando acima troca 2.0.1 a 1.0.8 no último comando, seu trabalho no bash

SergioAraujo
fonte
2

Para garantir que o -P|-L|-trabalho use o seguinte:

function cd () {
    typeset arg=
    case $1 in -|-L|-P) arg=$1 ; shift ;; esac
    [ $# -gt 1 ] && {
        builtin cd $arg "${PWD/$1/$2}"
    } || {
        builtin cd $arg "$@"
    }
}
Brett Ryan
fonte
1

Não tenho certeza sobre o AIX, mas lembro-me disso como um truque antigo do shell Korn nas caixas Solaris que eu costumava administrar. No seu exemplo, você digitaria o comando:

cd 2.0.1 1.0.8

Mais algumas informações aqui .

Trieu
fonte
Isso não funcionou para mim: ubuntu 10.04, bash "Lançamento do GNU bash, versão 4.1.5 (1) (i486-pc-linux-gnu)", tentei os seguintes comandos: 2048 cd 2049 cd ~ / src / local Você pode usar o seguinte comando: Ubuntu-patches / cdtest / dir-v1.0.9 / gnome-control-center-2.30.1 / capplets / network / 2050 cd dir-v1.2.9 dir-v1.0.9 / home / ing02741 / src / local-ubuntu- patches / cdtest / dir-v1.2.9 / gnome-control-center-2.30.1 / capplets / network é um caminho válido.
precisa saber é o seguinte
@koushik: Ele escreveu que é um truque do Korn. Você está usando o bash. bash! = korn. No Ubuntu, o ksh está disponível no pacote 'ksh'.
maxschlepzig
opps, meu mal. Desculpe, eu esqueci isso. @maxschlepzig - obrigado por apontar.
koushik