"Favoritos" para o bash

24

Navegar em várias camadas de diretórios aninhados geralmente é um problema. No Firefox, é fácil porque eles têm marcadores. Então, o que eu gostaria de fazer para marcar um arquivo como favorito é digitar:

$ go --add classes "repo/www/public/util/classes"

Então, para ir para esse diretório, digite:

$ go classes

Anteriormente, usei links simbólicos para obter algo semelhante, mas não quero desorganizar meu diretório pessoal. Existem muitos outros recursos que podem ser úteis. Por exemplo, eu gostaria de começar a digitar go cle clicar em tab para concluir automaticamente. Às vezes, faço check-out de várias cópias de um repositório e, portanto, seria útil que o programa permitisse criar vários contextos e definir o marcador em relação ao diretório da base de contexto.

Então, antes de começar a montar meu próprio conjunto de scripts, já existe algo assim?

Casebash
fonte
4
Se você continuar comparando bash com firefox, alguém fará uma
barra de awesomebar

Respostas:

12

Eu estava procurando por alguma ferramenta de bookmarking de shell por muito tempo e não estou satisfeito com nenhuma das soluções que encontrei.

No entanto, acabei encontrando uma grande ferramenta universal: o buscador difuso da linha de comando .

Ele permite principalmente que você encontre arquivos "difusos" (verifique a rica animação gif no link acima), mas também permite alimentar dados de texto arbitrários e filtrar esses dados. Portanto, a ideia dos atalhos é simples: tudo o que precisamos é manter um arquivo com caminhos (que são atalhos) e filtrar esse arquivo com difusão. Veja como fica: digitamos cdgcommand (de “cd global”, se você preferir), obtemos uma lista de nossos favoritos, selecionamos o necessário com apenas alguns toques de tecla e pressione Enter. O diretório de trabalho é alterado para o item selecionado:

cdg

É extremamente rápido e conveniente: geralmente apenas digito 3-4 letras do item necessário e todas as outras já estão filtradas. Além disso, é claro que podemos percorrer a lista com as setas ou com Ctrl+j/ Ctrl+k.

Artigo detalhado sobre esta solução de atalhos / favoritos está aqui: Atalhos difusos para o seu shell .

Dmitry Frank
fonte
19

Eu acho que você está procurando algo como salto automático . Você precisa se movimentar um pouco para desenvolver um conjunto de "pesos-chave" que se correlacionam com a quantidade de tempo gasto em um determinado diretório. Então, supondo que você tenha passado muito tempo no diretório 'classes', você pode ir diretamente para lá digitando

j cl

Você pode visualizar seus "pesos-chave" com

jumpstat
tcdyl
fonte
Recentemente encontrei um pouco mais complexa, mas interessante, e relacionado, ferramenta chamada f: github.com/clvv/f
tcdyl
14

Como Saeedn menciona, os pseudônimos são um bom mecanismo. O shell bash também tem um mecanismo interno para saltar para a direita para um local: CDPATH. Defina como PATH, mas é usado em cdvez de procurar programas.

$ CDPATH=:~/repo/www/public/util
$ cd classes
/home/casebash/repo/www/public/util/classes

Na página de manual:

   CDPATH The search path for the cd command.  This is  a  colon-separated
          list  of  directories  in  which the shell looks for destination
          directories specified by the cd  command.   A  sample  value  is
          ".:~:/usr".

Eu mesmo, combinei isso com um diretório que possui links simbólicos para onde eu gostaria de ir:

$ mkdir ~/cdshortcut
$ ln -s ~/repo/www/public/util/classes ~/cdshortcut/classes
$ CDPATH=:~/cdshortcut
/home/casebash/cdshortcut/classes

Isso tem a desvantagem de que o diretório não parece estar correto, mas que pode ser corrigido usando cd -Pou configurando set -P.

Arcege
fonte
CDPATH é interessante, mas provavelmente vale a pena usar um comando go separado, para que o comportamento seja sempre previsível.
Casebash
1
+1 para definir -P. Alguns dos meus links simbólicos estavam me deixando louco porque eu não conseguia lembrar onde eles realmente foram e não lembrava do comando que mostra essas informações.
21411 Joe
@ Joe, gostaria de acrescentar alias C='cd -P .', em vez de set -P, uma vez por links simbólicos do sistema Eu não me importo de ser no diretório link simbólico.
Curinga
@Wildcard - interessante - você poderia dar um exemplo em que isso faz a diferença para você? Acabei de executar help cde ainda não entendo o que a opção -P faz.
Joe
@Joemkdir test; ln -s test linktotest; cd linktotest; pwd; cd -P .; pwd
Wildcard
9

Você pode combinar o histórico existente do Bash e os recursos de pesquisa de histórico. Pressione Ctrl-Rpara iniciar a pesquisa reversa incremental e comece a digitar a parte do caminho que provavelmente será única.

Você pode continuar digitando as letras até retornar ao cdcomando mais recente envolvendo esse diretório ou pressionar Ctrl-Rnovamente para voltar ao histórico para o próximo comando mais recente correspondente ao que você digitou até agora.

Eu faço isso toda hora.

Na verdade, eu dou um passo adiante. Uma vez que eu começar a descobrir sequências de comandos vale a pena manter na história, mas não vale a pena se comprometer com um script shell, eu começo a acorrentar-los com &&e ;combinadores para que eu possa inverter-procurar uma substring de que um comando longo, hit Entere executar toda a sequência em uma vez.

Por exemplo, veja como eu construo e executo um dos meus programas durante o desenvolvimento:

$ ( cd .. ; make install ) && ./start_my_program

Eu faço isso no diretório de instalação, que fica abaixo do diretório de origem de nível superior. Ao envolver cd, compilar e instalar a parte em um sub-shell, garanto que não importa o que aconteça durante esse processo, eu retorne ao meu shell normal sem que nada seja alterado. Somente se tiver êxito (&&) eu inicio o programa construído e instalado. Eu posso encontrar isso na minha história com apenas um Ctrl-Rmomento sta, sendo tudo o que geralmente preciso para encontrar exclusivamente essa sequência de comandos.

Outro exemplo de como eu uso isso é a sequência que cria os RPMs para esse mesmo programa. A maior parte do trabalho tedioso está em scripts de shell, mas ainda existem alguns comandos que eu normalmente teria que digitar para fazer todo o trabalho de construção e implantação dos RPMs construídos, que agora raramente preciso digitar novamente, porque o Bash mantém na história para mim.

Combine tudo isso com export HISTSIZE=bignume shopt histappende você acabou de construir uma memória de comando elephantine.

Outra solução que eu codifiquei uma vez está na minha resposta a outra pergunta aqui . Pode ter que ser personalizado para seus propósitos, e apenas lida com cdcomandos, enquanto a opção de pesquisa de histórico funciona em qualquer lugar e para cada comando.

Warren Young
fonte
6

Eu mesmo uso aliaspara encurtar caminhos longos que visito frequentemente. Você pode colocar seu conjunto de aliases no seu bashrc, para que o bash se lembre deles sempre que fizer login. Felizmente, o bash adiciona aliases à conclusão automática.

Eu escreveria algo assim para o seu caso: alias go-classes="cd ~/repo/www/public/util/classes"

saeedn
fonte
6

Você pode estar procurando por marcas de base (no github).
No README:

Bashmarks é um script de shell que permite salvar e pular para os diretórios mais usados. Agora suporta a conclusão da guia.

Giuseppe Rota
fonte
4

Isso não é de forma alguma completo nem infalível, apenas um rascunho para começar. Ao adicionar o seguinte no seu, ~/.bashrcvocê terá três comandos para adicionar indicadores de exclusão e lista de diretórios (que são baseados em aliases de shell, para que você também obtenha a conclusão automática).

BMFILE=~/.bash.bookmarks
[ -f "$BMFILE" ] && . "$BMFILE"

bmadd() {
    local abm
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    abm="alias $bm='cd \"$(pwd)\"'"

    if grep -q " $bm=" "$BMFILE"; then
        echo "Overwriting existing bookmark $bm"
        bmdel "$bm"
    fi
    echo "$abm" >> "$BMFILE"
    eval "$abm"
    #source "$BMFILE"
}

bmdel() {
    local bms
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    #sed -i.bak "/ $bm=/d" "$BMFILE"
    bms=$(grep -v " $bm=" "$BMFILE")
    echo "$bms" > "$BMFILE"
    unalias "$bm" 2> /dev/null
}

bmlist() {
    sed 's/alias \(.*\)=.cd "\(.*\)".$/\1\t\2/' "$BMFILE" | sort
}

O uso é bem simples. bmaddcom um argumento adiciona um alias nomeado após o argumento. Esse alias apenas cria um CD no diretório em que foi definido. Sem um argumento, ele usa o dirname atual como o nome do alias. Da mesma forma, bmdelexclui um alias, se existir, e bmlistlista os favoritos atuais.

por exemplo

u@h:~ $ cd /usr/share/doc
u@h:/usr/share/doc $ bmadd
u@h:/usr/share/doc $ cd /usr/local/share/
u@h:/usr/local/share $ bmadd lshare
u@h:/usr/local/share $ cd
u@h:~ $ bmlist
doc     /usr/share/doc
lshare  /usr/local/share
u@h:~ $ doc
u@h:/usr/share/doc $ bmdel lshare
u@h:/usr/share/doc $ bmlist
doc     /usr/share/doc
u@h:/usr/share/doc $
forcefsck
fonte
4

Encontrei a mesma necessidade há algum tempo e decidi montar alguns scripts para me ajudar a marcar caminhos absolutos / relativos e mapeá-los para nomes mais curtos dos quais me lembro facilmente.

O script é muito fácil de usar e simplesmente cria uma função com o nome abreviado que você fornece como um alias para o diretório no qual deseja pular. Tudo o que você precisa fazer é simplesmente digitar esse nome abreviado e ele o levará ao diretório marcado.

Aqui está um link para a fonte do script do marcador. A propósito, eu o chamei de Bookmarker.

Uso

Uma vez instalado, é bastante trivial de usar.

Para marcar um diretório:

$ mark /this/is/a/very/very/looooong/path mydir

Para navegar para um diretório marcado:

$ mydir

Para ver o que foi marcado:

$ marks
bin     -> /Users/khafaji/bin
eBooks  -> /Users/khafaji/eBooks

Para excluir um diretório marcado:

$ umark myDir

Para mais exemplos, instruções de instalação, etc., consulte a documentação muito detalhada .

Hass Joseph K.
fonte
3

cdargs é a melhor ferramenta para bookmarking de diretório.

Para exemplos de uso, consulte os indicadores do vídeo de comando cd no YouTube.

Exemplo de uso

cdargsé uma interface gráfica ncurses para que você possa navegar visualmente dentro do seu shell. Depois de instalado, você o configura em um determinado shell, fornecendo um script de shell:

$ source /etc/profile.d/cdargs.sh

Isso habilita várias funções que você pode chamar do seu shell.

Convocar a GUI:

$ cv

Resultando neste tipo de GUI:

   [.       ]  /home/saml/tst/88040
 0 [path0   ]  /home/saml/tst/88040/path0
 1 [path1   ]  /home/saml/tst/88040/path1
 2 [path2   ]  /home/saml/tst/88040/path2

Você pode usar as teclas de seta para mover para cima e para baixo e navegar na lista. A seta esquerda ( ) sobe um nível na árvore de diretórios, uma seta direita ( ) é detalhada em um diretório.

diretórios de marcação:

Você pode usar co diretório atual em que está navegando ou aadicionar o diretório que está destacando no momento com o cursor.

modos de operação:

cdargsé um pouco como vi / vim nesse sentido, onde tem essa noção de modos . Existem 2 deles, navegando (B) e listando (L). Você pode ver em qual modo está na tela na parte inferior do seu shell.

Modo de listagem:

L: /home/saml/tst/88038

Modo de navegação:

B: /home/saml/tst/88038

Você pode alterar seu modo pressionando a tecla Tab ( TAB).

Esta é apenas a ponta do iceberg, consulte a página de manual ( man cdargs) e também a ajuda interna para obter mais informações.

Emon
fonte
2

A melhor ferramenta para isso é: wcd . Eu testei muitas outras ferramentas, e essa é usada exatamente da maneira que você está perguntando e é melhor em muitos sentidos do que em todas as soluções anteriores.

Daniel Fanjul
fonte
1

As outras respostas são ótimas e específicas. Outra maneira de ver isso é usar um processador de macro do teclado que pode fazer quase qualquer coisa que você possa imaginar.

Confira AutoKey. Ele pode substituir frases como a correção automática do processador de texto ou o histórico do bash e também pode executar um script python em uma tecla de atalho que você define, que pode fazer quase qualquer coisa e também pressionar as teclas do dispositivo de entrada de caracteres - como se você as tivesse digitado.

A única "falha" que possui (em relação a essa pergunta) é que ele precisa de uma interface gráfica para rodar no - gnome ou no kde. As outras respostas não têm esse requisito.

https://code.google.com/p/autokey/
Joe
fonte
1

Existe uma outra alternativa chamada z .

Ele aprende em todas as alterações de diretório:

$ cd /tmp/
$ pwd
/tmp
$ cd
$ pwd
/home/user

Em seguida, você pode mudar para esse diretório mais tarde com a correspondência difusa:

$ z mp
$ pwd
/tmp
KARASZI István
fonte
1

Apparix é outra ferramenta que faz isso. Um de seus recursos úteis é que você pode pular diretamente para os subdiretórios da marca e preencher tabulação nesses subdiretórios.

micans
fonte
0

Outra solução que, acredito, é autojumpe zé fasd.

Ele monitora quais diretórios você visita e z dir-name mudará para o diretório com o nome dir-nameque você usa com mais frequência. Ele também possui algumas funcionalidades para arquivos usados ​​com freqüência.

Você pode cloná-lo em: https://github.com/clvv/fasd

A instalação é simples, clona, ​​faz a instalação e modifica seu .bashrc(ou .zshrcetc).

Jonathan
fonte
0

Você precisa adicionar um alias ao seu .bashrcou .bash_profile.

## navigate to your home directory
$ cd ~
## list the contents of your home directory to see if you have `.bashrc` or `.bash_profile`
$ ls -a 
[`.bashrc` or `.bash_profile` should appear in the list]
## launch the text editor of your choice; I'll use vim here
## if no `~/.bashrc` or `~/.bash_profile`...
$ vim
## if, e.g., `~/.bash_profile` listed...
$ vim ~/.bash_profile

Agora, digamos que você queira um atalho ~/Desktop/Coding/Projectspara invocar o que você digitará goto_Projs. Você precisa adicionar a seguinte linha ao arquivo aberto no editor de texto:

alias goto_Projs='cd ~/Desktop/Coding/Projects'

Agora faça o que seu editor de texto quiser que você salve (para /User/<yourusername>/ou é ~/claro) e saia e, quando o prompt do shell for retornado, vá

source ~/.bash_profile

Seu alias agora deve estar disponível para chamar, conforme descrito acima.

Nathan P. Keene
fonte
0

Eu uso o método de anexar um comentário no final do comando e depois invocar ctrl Ra pesquisa reversa para o comentário. Isso tem as seguintes vantagens:

  • procure um comando em linguagem natural
  • altere o comentário a qualquer momento e obtenha a atualização mais recente de ctrl R
  • usar ctrl Retab em tempo real para fazer pequenos ajustes no próprio comando, tornando o comentário um tipo de atalho genérico para uma família de comandos semelhantes
  • não são necessárias configurações, instalações ou manutenção de livros :-)
erav
fonte