“Bookmarks” para o bash

23

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

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

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

$ go classes

Anteriormente, usei links simbólicos para obter algo semelhante, mas não quero sobrecarregar meu diretório pessoal. Existem muitos outros recursos que podem ser úteis. Por exemplo, gostaria de poder começar a escrever go cl e depois clicar no separador para o preenchimento automático. Às vezes, tenho várias cópias de um repositório com check-out e, portanto, seria útil para o programa permitir que eu criasse vários contextos e definisse o indicador em relação ao diretório base do contexto.

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

    
por Casebash 14.12.2011 / 06:00

16 respostas

12

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

No entanto, acabei encontrando uma ótima ferramenta universal: localizador difuso da linha de comando .

Ele basicamente permite que você localize arquivos "fuzzy-find" (verifique a animação do rich gif pelo link acima), mas também permite que dados de texto arbitrários sejam dados a ele e filtre esses dados. Portanto, a ideia de atalhos é simples: tudo o que precisamos é manter um arquivo com caminhos (que são atalhos) e filtrar esse arquivo. Veja como fica: nós digitamos o comando cdg (de “cd global”, se você quiser), obtenha uma lista de nossos favoritos, escolha o necessário com apenas alguns toques no teclado e pressione Enter. O diretório de trabalho é alterado para o item escolhido:

Éextremamenterápidoeconveniente:geralmenteeudigitode3a4letrasdoitemnecessário,etodasasoutrasjáestãofiltradas.Alémdisso,éclaroquepodemospercorreralistacomasteclasdesetaoucomCtrl+j/Ctrl+k.

Umartigodetalhadosobreestasoluçãodeatalhos/marcadoresestáaqui: Atalhos difusos para o seu shell .

    
por 16.06.2015 / 00:37
18

Acho que você está procurando algo como autojump . Você precisa rodar 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 nesse diretório de 'classes', você poderia pular direto para lá digitando

j cl

Você pode ver seus "pesos-chave" com

jumpstat

Espero que isso ajude. Felicidades.

    
por 14.12.2011 / 10:00
14

Como diz o site, os aliases são um bom mecanismo. O shell bash também possui um mecanismo integrado para ir diretamente para um local: CDPATH . Defina como PATH , mas é usado por cd em vez de procurar por 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, eu combinei isso com um diretório que tem 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 o diretório não parecer correto, mas isso pode ser corrigido usando cd -P ou configurando set -P .

    
por 14.12.2011 / 06:54
9

Você pode combinar os recursos de pesquisa de história e histórico existentes do Bash. Pressione Ctrl-R para iniciar a busca inversa incremental, depois comece a digitar a parte do caminho com maior probabilidade de ser única.

Você pode continuar digitando letras até voltar ao comando cd mais recente envolvendo esse diretório, ou pressionar Ctrl-R novamente para voltar ao histórico para o próximo comando mais recente combinando com o que você digitou até agora.

Eu faço isso o tempo todo.

Na verdade, eu dou um passo adiante. Uma vez que eu comece a descobrir sequências de comandos que valem a pena manter na história, mas não vale a pena se comprometer com um shell script, eu começo a encadear com && e ; combinators para que eu possa inverter a busca por uma substring daquele comando longo Digite e execute toda a seqüência de uma só vez.

Por exemplo, aqui está 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 está abaixo do diretório de origem de nível superior. Envolvendo o cd , compilar e instalar parte em um sub-shell, eu garanto que não importa o que aconteça durante esse processo, eu acabo voltando ao meu shell normal sem nada mudar. Somente se isso for bem sucedido (& &) eu inicio o programa construído e instalado. Eu posso encontrar isto na minha história com apenas um Ctrl-R então s t a , sendo isto tudo que eu geralmente precisa encontrar exclusivamente esta seqüência de comando.

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

Combine tudo isso com export HISTSIZE=bignum e shopt histappend e você acabou de criar uma memória de comando elephantine.

Outra solução que codifiquei está em minha resposta para outra pergunta aqui . Ele pode ter que ser adaptado para seus propósitos, e ele só lida com os comandos cd , enquanto a opção de pesquisa de histórico funciona em todos os lugares e para todos os comandos.

    
por 14.12.2011 / 06:30
6

Eu mesmo uso alias para encurtar caminhos longos que eu visito com frequência. Você pode colocar seu conjunto de alias es no seu bashrc , então o bash poderia se lembrar delas toda vez que você fizer o login. E, felizmente, o bash adiciona aliases ao preenchimento automático.

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

    
por 14.12.2011 / 06:17
6

Você pode estar procurando por bashmarks (no github).
Do README:

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

    
por 14.12.2011 / 17:51
4

Isto não é de forma alguma completo nem à prova de erros, apenas um rascunho para começar. Adicionando o seguinte no seu ~/.bashrc , você terá três comandos para adicionar os marcadores do diretório delete e list (que são baseados nos aliases do shell, assim você também obtém auto-completar).

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 "\(.*\)".$/\t/' "$BMFILE" | sort
}

O uso é bem simples. bmadd com um argumento adiciona um alias com o nome do argumento. Esse alias apenas faz um cd para o diretório em que foi colocado. Sem um argumento, ele usa o nome da pasta atual como o nome do alias. De maneira semelhante, bmdel exclui um alias se existir e bmlist lista os marcadores 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 $
    
por 14.12.2011 / 10:00
4

Eu me deparei com 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 que eu possa lembrar facilmente.

O script é muito fácil de usar e simplesmente criará 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 curto e ele levará seu caminho até o diretório marcado.

Aqui está um link para a fonte do script do bookmarker. By the way, eu nomeei o Bookmarker.

Uso

Uma vez instalado, é bastante fácil de usar.

Para marcar um diretório:

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

Para navegar para uma dirctory marcada:

$ 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 detalhada .

    
por 25.08.2013 / 23:59
3

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

Para exemplos de uso, consulte os marcadores para o vídeo do comando do CD no YouTube.

Exemplo de uso

cdargs é uma GUI ncurses para que você possa navegar visualmente em seu shell. Uma vez instalado, você o configura em um determinado shell, obtendo 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 para navegar na lista. A seta para a esquerda () sobe um nível na árvore de diretórios, uma seta para a direita () se expandirá em um diretório.

diretórios de marcação:

Você pode usar c para o diretório atual que você está navegando ou você pode usar a para adicionar o diretório que você está destacando no momento com o cursor.

modos de operação:

cdargs é um pouco parecido com o vi / vim a esse respeito, onde ele tem essa noção de modos . Existem 2 deles, navegando (B) e listando (L). Você pode ver em qual modo você está através da exibição 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 man page ( man cdargs ) e também a ajuda integrada para obter mais informações.

    
por 27.02.2013 / 19:55
2

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

    
por 21.10.2012 / 16:07
1

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

Confira a AutoKey. Ele pode substituir frases como um autocorreto de processador de texto ou histórico de bash e também pode executar um script python em uma tecla de atalho que você pode fazer quase qualquer coisa e também enviar pressionamentos de tecla ao dispositivo de entrada de caracteres - como se você os tivesse digitado. >

O único "defeito" que ele tem (em relação a esta questão) é que ele precisa de um gui para rodar no gnome ou no kde. As outras respostas não têm esse requisito.

https://code.google.com/p/autokey/
    
por 17.12.2011 / 23:13
1

Existe outra alternativa chamada z .

Ele aprende em cada alteração de diretório:

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

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

$ z mp
$ pwd
/tmp
    
por 27.04.2016 / 12:08
1

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

    
por 08.06.2018 / 11:24
0

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

Ele controla quais diretórios você visita e z dir-name mudará para o diretório com o nome dir-name que você usa com mais frequência. Também tem alguma funcionalidade para arquivos usados com frequência.

Você pode clonar a partir de: link

A instalação é direta, clone, make install e, em seguida, modifique seu .bashrc (ou .zshrc etc).

    
por 10.11.2016 / 08:53
0

Você precisa adicionar um alias ao seu .bashrc ou .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 para ~/Desktop/Coding/Projects , para 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 deseja que você faça para salvar (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 invocar conforme descrito acima.

    
por 24.08.2017 / 08:15
0

Eu uso o método de acrescentar um comentário no final do comando e, em seguida, invoco ctrl R para inverter a pesquisa do comentário. Isto tem as seguintes vantagens:

  • procura por um comando na linguagem natural
  • altere o comentário a qualquer momento e obtenha a atualização mais recente em ctrl R
  • use ctrl R e tab on the fly para fazer pequenos ajustes no comando em si, tornando o comentário um tipo de atalho genérico para uma família de comandos semelhantes
  • nenhuma configuração, instalação ou manutenção de livros é necessária: -)
por 10.09.2017 / 19:55

Tags