Equivalente de alias para um link simbólico?

18

Eu me pego precisando pular alguns diretórios na minha pasta pessoal com frequência e me canso de escrevê-los. Eu gostaria de uma abordagem mais rápida, que tradicionalmente seria um link simbólico.

No entanto, não quero encher meu diretório pessoal com dezenas de links simbólicos. Eu poderia criar um ~/links/diretório e confundi- lo com links simbólicos, mas ainda é feio. Além disso, convém criar links simbólicos que mudam a cada dia (definidos em .bashrc) para ir para o diretório de dias atuais.

Existe uma maneira de criar um apelido eficaz para um link simbólico, criando algo que será reconhecido como um link para navegação rápida, mas na verdade não aparecerá quando eu fizer um lsdos meus diretórios pessoais e não durará além da sessão atual?

dsollen
fonte
4
você pode querer ver o pushd e o popd
Rui F Ribeiro
Acho que a abordagem de Jeroen Janssen é adaptável e de baixo custo para essa necessidade exata: jeroenjanssens.com/2013/08/16/…
Theophrastus
2
Qual shell você está usando?
Gilles 'SO- stop be evil'
@ Theophrastus Heh - isso é basicamente o que eu reimplementei de maneira não tão elegante em minha resposta.
mattdm
3
não é exatamente o que você está procurando, mas ainda pode ser útil quando você alterna entre dois diretórios: cd -will cdno último diretório anteriormente. Portanto, se você fizer isso duas vezes, voltará para onde começou ... muito bom para a situação "oh, esqueci de editar someFile.txt no local anterior" => Simplesmente: cd -edite someFile.txtcd -
dingalapadum

Respostas:

12

Você pode usar a conclusão da guia. Por padrão, em muitas distribuições Linux, o bash é configurado para que, quando você pressiona a tecla [TAB], receba uma lista de possíveis correspondências ou, se houver apenas uma correspondência, tudo estiver preenchido. Para cd, normalmente é uma lista de subdiretórios do diretório de trabalho atual. Você pode sobrescrever isso, mas sugiro que crie um alias, como jdpara "diretório de salto":

alias jd=cd

e, em seguida, definindo os "indicadores" desejados como conclusões para o jd. Consulte a página de manual do bash para muito mais opções (incluindo a geração automática de resultados em tempo real a partir de um comando ou função), mas a maneira mais fácil é apenas uma lista de palavras, com -W:

completo -W "/ srv / www ~ / tmp ~ / work" jd

Agora, digite jde pressione [TAB] e você verá seus "favoritos". Digite qualquer parte ambígua e, em seguida, pressione [TAB] para concluir. (Acima, os ~s se expandem para o meu diretório pessoal, então o primeiro [TAB] me dá um /, e se eu pressionar we [TAB] novamente, /srv/wwwé preenchido.)

Obviamente, coloque isso ~/.bash_profilepara fazê-lo persistir.

Ou, podemos levar isso para o próximo nível. Crie um diretório ~/.shortcuts- começando com um ponto, ele ficará oculto e não atrapalhe seu diretório pessoal limpo e agradável - e preencha-o com links simbólicos para os diretórios desejados. Em seguida, coloque isso em seu ~ / .bash_profile:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

Isso define uma conclusão um pouco mais complicada na função _list_shortcutsde criar a lista de nomes e faz com que jdseja uma função e não um alias simples, pois queremos que ele atue de maneira diferente da justificada cd. A -Pbandeira cdfaz com que resolva os links simbólicos, para que tudo se torne uma mágica transparente. Seus nomes de atalho nem precisam corresponder aos alvos.

Então:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

E, para uma dose extra de fantasia, faça uma jdlista de todos os seus atalhos quando executados sem nenhum parâmetro:

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

Nota: eu uso em compgen -W $( cmd )vez de compgen -C 'cmd'porque o último nunca funciona para mim e não entendo o porquê. Essa pode ser uma nova pergunta minha. :)

mattdm
fonte
muito interessante. Uma captura, no entanto, ainda requer digitar o link completo, ou pelo menos o suficiente para se tornar não ambíguo, antes que eu possa concluir com o jd. Alguma maneira de adicionar aliases aos comandos jd para encurtá-los? ou torná-los relativos a um diretório em que posso armazenar links simbólicos, suponho.
precisa
@dsollen Ver atualização :)
mattdm
isso funcionou perfeitamente. Com toda a honestidade, eu não esperava uma boa resposta para essa pergunta, mas isso é exatamente o que eu queria. Prevejo um pouco de uso disso e parece limpo o suficiente para adicionar à lista de coisas que modifico sempre que recebo uma nova VM (eu ainda tenho uma maneira automatizada de clonar minhas alterações ambientais padrão para uma nova vm lol). Muito obrigado. Em algum momento, quando eu tiver mais tempo livre eu vou descobrir como a sintaxe para o COMPREPLY funciona;)
dsollen
18

Os aliases de shell têm o recurso que você pode executar (alguns) para completar nomes (geralmente vinculado a tab). Como alternativa, você pode usar o CDPATHrecurso, que "recentemente" (nos últimos 5 a 6 anos) foi aprimorado para oferecer suporte ao preenchimento de nome. Se isso funcionar para você, tem a vantagem de que o que você digita é o nome real do diretório, em vez de um mnemônico para ele.

De acordo com o manual do bash

CDPATH
Uma lista de diretórios separada por dois pontos usada como um caminho de pesquisa para o cdcomando interno.

Leitura adicional:

Thomas Dickey
fonte
Não sabia sobre a CDPATHvariável de ambiente, obrigado. Eu poderia adicionar meu git_reposdiretório a essa variável .... #
Wildcard
16

Para os diretórios que você costuma frequentar, mas não muda diariamente, outra opção é apenas ter vários aliascomandos no seu .bashrcarquivo:

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

Um amigo tem cerca de 50 deles; Eu tenho um punhado; Rápido e fácil. Somente

cdo

alterar o diretório para / u01 / app / oracle

Mark Stewart
fonte
De fato. Eu tenho usado esse mecanismo desde o início dos anos 90.
wallyk
7

Eu recomendo pushde popd.

Pessoalmente, acho-os úteis ao realizar trabalhos de desenvolvimento / ler código-fonte, quando vários diretórios estão envolvidos.

Eles implementam efetivamente uma estrutura de pilha / LIFO, na qual você PUSH um diretório ( pushd) e o próximo comando de diretório POP ( popd) o recupera.

Então, quando dentro de um dir, você faria:

pushd .

E quando você precisa recuperá-lo, você faz

popd

Você pode executar múltiplos pushd, e fazer o popd(s) correspondente (s) posteriormente, para retornar aos diretórios.

Vou deixar aqui um link.

http://www.eriwen.com/bash/pushd-and-popd/

Rui F Ribeiro
fonte
11
Esta é a solução que eu uso também, exceto que eu não uso popdmuito. Encho minha dirslista (que é preenchida por pushdcomandos) com todos os diretórios em que quero visitar / trabalhar nesse período de tempo, depois corro pushd +1. Então, eu posso percorrer os diretórios com um simples !puque é muito rápido. (Note-se que em ambos Ubuntu e CentOS, pushdé a única de comando disponíveis em uma instalação limpa que começa com pu.)
Wildcard
3

Você pode simplesmente colocá-los como variáveis ​​no seu ~/.bashrce então eles estão a uma certa $distância.

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj
Ewan Mellor
fonte
3

A resposta óbvia são as variáveis , aquelas coisas simbólicas no shell que representam outras coisas, da mesma forma que os links simbólicos no sistema de arquivos.

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

Em qualquer shell decente, você obtém a Tabconclusão de nomes de variáveis, o que ajuda ainda mais.

Kaz
fonte