Existe um histórico de diretório para o bash?

26

Existe algo como o histórico de pesquisa reversa do bash (Ctrl-r), mas apenas para diretórios?

Eu tenho algumas hierarquias profundas de pastas nas quais quero pular, então gostaria de usar algo como histórico de pesquisa reversa, mas ele apenas procura nomes de pastas e me fornece caminhos absolutos.

Essencialmente, daria resultados semelhantes ao uso, !?mas apenas comandos correspondentes, de cd na frente, você pode percorrer os resultados e os caminhos completos.

Até agora, a melhor solução que encontrei é o bashmarks .

idbrii
fonte
1
Recentemente, comecei a usar z e isso parece funcionar até agora, mas usei-o em alguns caminhos.
Rob

Respostas:

11

Dê uma olhada no autojump :

Um dos comandos de shell mais usados ​​é o "cd". Uma rápida pesquisa entre meus amigos revelou que entre 10 e 20% de todos os comandos digitados são na verdade comandos de cd! Infelizmente, pular de uma parte do seu sistema para outra com o cd exige que você digite quase o caminho completo, o que não é muito prático e exige muitas teclas.

autojump é uma maneira mais rápida de navegar no seu sistema de arquivos. Ele funciona mantendo um banco de dados dos diretórios que você mais usa na linha de comando. O comando jumpstat mostra o conteúdo atual do banco de dados. Você precisa trabalhar um pouco antes que o banco de dados se torne utilizável. Quando seu banco de dados estiver razoavelmente completo, você pode "pular" para um diretório comumente "cd" digitando:
j dirspec

Graham
fonte
Isso pode levar a problemas com o título do Terminal .
Daniel Beck
6

Há sim

cd -

esse é o comando "cd [espaço] [hífen]", que vai para o diretório em que você estava antes, essencialmente um "histórico de profundidade 1". "Cd -" repetido alterna entre dois diretórios.

Citando a página do manual:

Os seguintes operandos devem ser suportados: [...]

Quando um [hífen] é usado como operando, isso deve ser equivalente ao comando:

      cd "$OLDPWD" && pwd

Infelizmente, não conheço um histórico de diretórios interno real.

apurkrt
fonte
Há um pushd dir popdpar que pode armazenar sua pilha de diretórios do histórico. Isso é realmente útil em scripts que operam em pastas diferentes.
Jakuje 25/10/2015
Eu conheço pushde popd, e também já é mencionado aqui.
apurkrt
3

O bash possui pushd / popd / dirs. Eu tenho isso no meu .bashrc para enviar automaticamente os diretórios para a pilha do bash.

#let cd also pushd directories into stack. Use popd to reverse stack
function cd ()
{
  if [ -e $1 ]; then 
    pushd $1 &> /dev/null   #dont display current stack 
  fi
}

Pop-los usando popde exibir a pilha usandodirs

user3131651
fonte
2

Eu tive uma boa experiência com o z-jump . Permite a conclusão, embora apenas para o destino final, não percorrendo um caminho. No entanto, ele mostra o caminho completo após a conclusão da guia.

ovóide
fonte
1

Apenas para enfatizar minha própria experiência, escrevi um script simples para atender a esse requisito há algum tempo; ele substitui o comando cd incorporado por uma função simples que anexa o novo local do diretório a um arquivo de histórico; um script python é usado para forneça uma interface bash que atualize dinamicamente uma lista ordenada de diretórios conforme você digita os termos de pesquisa, um pouco como a pesquisa de comando reverso do bash.

Está disponível no git-hub para aqueles que são curiosos.

Gearoid Murphy
fonte
rock on Gearoid
Darth Egrégio
1

Gostaria de recomendar o meu ltcdpara uma navegação rápida no histórico de diretórios:

https://github.com/dczhu/ltcd

cd demo gif

Ele fornece os seguintes recursos para facilitar a vida:

  • Lista global de diretórios, que mostra os diretórios visitados recentemente de todas as guias / janelas do terminal.
  • Listagem de diretório local, que é local para a sessão atual do shell.
  • Ambas as listagens oferecem suporte à navegação rápida usando j / k (descer / subir), números e pesquisa de palavras.
  • Salto livre global (por exemplo, "cd dir" ou "cd ar" para ir para / path / to / foo / bar / directory /).
treulz
fonte
1

Eu criei um script que tem funcionalidade semelhante ao comando oh-my-zshdirs -v que funciona no bash. Se você já usou o oh-my-zsh , deve ter notado que o histórico de diretórios fornecido pelo comando dirs -vserá redefinido toda vez que você sair do terminal. No entanto, isso não acontecerá se você usar esse script .

A funcionalidade:

  • Mostra a lista dos 10 diretórios usados ​​mais recentes com d.

  • Vá para qualquer diretório da lista digitando o número do diretório na lista. Você precisa usar 0 em vez de 10 para pular para o 10º diretório.

  • Um caminho de diretório será colocado no topo da lista sempre que você usar v( vim ) para editar arquivos ou o( xdg-open ) para abrir um arquivo desse diretório. Ou, se quiser, sempre que você visitar um diretório.

Você pode vê-lo em ação aqui .

M Imam Pratama
fonte
0

Bem, você pode adicionar esse trecho de código ao seu ~/.bashrc, o que

  1. fornece um comando cd personalizado

        function cd ()
        {
            exists=false
            for dir in "${CDHIST[@]}"; do
                [ "$dir" == "$1" ] && {
                    exists == true
                    break
                }
            done
    
            $exists || {
                len=${#CDHIST[@]}
                ${CDHIST[$len]} = "$1"
            }
    
            builtin cd "$1"
        }
  2. e fornece um comando de pesquisa de histórico de cd.

    function cdhist ()
    {
        #TODO: Make this magical.
    
        for dir in "${CDHIST[@]}"; do
            echo "$dir"
        done
    }

Obviamente, o comando cdhist que forneci é muito básico, e não o que você queria; mas é concebível usar instruções de caso ou expansão de parâmetro para obter algo semelhante ao que você deseja.

Você pode até adicionar alguma função "Conclusão programável", que pode ser usada para adicionar o cd /path/to/mydircomando completo com base em uma sub-string exclusiva de /path/to/unique/mydir, embora esse método ainda exija que você digite cd unique/mydir<tab>.

jpaugh
fonte
1
Eu li mal o seu código e encontrei o dirscomando do bash, que faz essencialmente a mesma coisa que my_dirs, mas em uma linha.
Idbrii
1
Legal. Portanto, o bash não apenas o suporta; que implementa -lo. Eu gostaria de ter mais tempo para estudar a magia profunda do bash. Obviamente, isso suporta apenas lembrar pushd, não cd. Mas suponho alias cd=pushdque seria a forma mais elegante.
jpaugh
0

Você pode construir seu próprio cdcomando com pushd, popd, dirs comandos internos.

Uso

  • cd -- (lista histórico atual)

  • cd -num (vá para o diretório num)

  • cd - (vá para o diretório anterior)


function cd()
{
    local hnum=16  # number of entries
    local new_dir index dir cnt
    if ! [ $# -eq 0 ]; then
        if [[ $# -eq 2 && $1 = "--" ]]; then
            shift
        else 
            if ! { [ $# -eq 1 ] && [[ $1 =~ ^(-[0-9]{,2}|-|--|[^-].*)$ ]] ;}
            then
                builtin cd "$@"
                return
            fi
        fi
    fi
    [ "$1" = "--" ] && { dirs -v;  return ;}
    new_dir=${1:-$HOME}
    if [[ "$new_dir" =~ ^(-[0-9]{,2}|-)$ ]]; then
        index=${new_dir:1}
        [ -z "$index" ] && index=1
        new_dir=$(dirs -l +$index) || return
    fi
    pushd -- "$new_dir" > /dev/null || return
    popd -n +$hnum &> /dev/null
    new_dir=$PWD cnt=1
    while dir=$(dirs -l +$cnt 2> /dev/null); do
        if [ "$dir" = "$new_dir" ]; then
            popd -n +$cnt > /dev/null
            continue
        fi
        let cnt++
    done
}

export -f cd
mug896
fonte
-1

Eu montei essa ferramenta, que combina soluções anteriores para armazenar um histórico abrangente de CLI global com uma ferramenta de grepping interativa chamada percol (mapeada para C ^ R). Eu o uso para recuperar comandos por onde eles foram executados ou para encontrar um diretório por um comando. Ainda está bom na primeira máquina que comecei a usá-la, agora com um histórico de CLI com mais de 2 anos.

A ferramenta grep funciona no caminho e no comando, mas ainda pode ser útil para você. Veja também 'dirs -v' no zsh

https://github.com/gawells/ariadne

Gordon Wells
fonte
isso armazena um histórico da CLI com caminho, comando e data. Não é caminho-only, mas ainda útil para a história busca dir reversa (bash e zsh)
Gordon Wells
Acho que você esqueceu de vincular à sua ferramenta. Pela sua descrição, eu suspeitaria que seja deficiente, pois os comandos funcionam apenas de onde são chamados. Então, cd share/mansó funciona se eu já estiver em / usr.
Idbrii 26/09/17
oops! meu mau, eu pensei que eu iria colocar a url no texto, não notou algo deu errado
Gordon Wells