Existe-t-il un historique de répertoire pour bash?


26

Existe-t-il quelque chose comme l'historique de recherche inversée de bash (Ctrl-r), mais uniquement pour les répertoires?

J'ai des hiérarchies de dossiers approfondies vers lesquelles je veux passer, donc j'aimerais utiliser quelque chose comme la recherche inversée-historique, mais il ne recherche que les noms de dossiers et me donne des chemins absolus.

Essentiellement, cela donnerait des résultats similaires à ceux de l'utilisation, !?mais uniquement des commandes correspondantes avec cd à l'avant, vous pouvez parcourir les résultats et les chemins d'accès complets.

Jusqu'à présent, la meilleure solution que j'ai trouvée est celle des bashmarks .


1
J'ai récemment commencé à utiliser z et cela semble fonctionner jusqu'à présent, mais je l'ai utilisé pour quelques chemins.
Rob

Réponses:


11

Jetez un oeil à autojump :

Une des commandes shell les plus utilisées est «cd». Un rapide sondage auprès de mes amis a révélé qu'entre 10 et 20% de toutes les commandes qu'ils tapent sont en fait des commandes cd! Malheureusement, passer d'une partie de votre système à une autre avec cd vous oblige à entrer presque le chemin complet, ce qui n'est pas très pratique et nécessite beaucoup de touches.

autojump est un moyen plus rapide de naviguer dans votre système de fichiers. Il fonctionne en maintenant une base de données des répertoires que vous utilisez le plus à partir de la ligne de commande. La commande jumpstat vous montre le contenu actuel de la base de données. Vous devez travailler un peu avant que la base de données ne devienne utilisable. Une fois que votre base de données est raisonnablement complète, vous pouvez «sauter» vers un répertoire généralement «cd» en tapant:
j dirspec


Cela pourrait entraîner des problèmes avec le titre de Terminal .
Daniel Beck

6

Il y a

cd -

c'est la commande "cd [espace] [trait d'union]", qui va dans le répertoire que vous étiez auparavant, essentiellement un "historique de la profondeur 1". "Cd -" répété bascule entre deux répertoires.

Page de manuel de citation:

Les opérandes suivants doivent être pris en charge: [...]

Lorsqu'un [trait d'union] est utilisé comme opérande, cela doit être équivalent à la commande:

      cd "$OLDPWD" && pwd

Malheureusement, je ne connais pas de véritable historique de répertoire intégré.


Il y a une pushd dir popdpaire qui peut stocker votre pile d'historique de répertoires. C'est vraiment utile dans les scripts qui fonctionnent dans différents dossiers.
Jakuje

Je connais pushdet popd, et il est également mentionné ici déjà.
apurkrt

3

bash a pushd / popd / dirs. J'ai ceci dans mon .bashrc pour pousser automatiquement les répertoires sur la pile de 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 ces en utilisant popdet afficher la pile en utilisantdirs


2

J'ai une bonne expérience du z-jump. Il permet l'achèvement, mais uniquement pour la destination finale, sans passer par un chemin. Il montre cependant le chemin complet à la fin de l'onglet.


1

Juste pour faire écho à ma propre expérience, j'ai écrit un script simple pour répondre à cette exigence il y a quelque temps, il remplace la commande cd intégrée avec une fonction simple qui ajoute le nouvel emplacement du répertoire à un fichier historique, un script python est ensuite utilisé pour fournir une interface bash qui met à jour dynamiquement une liste ordonnée de répertoires lorsque vous entrez des termes de recherche, un peu comme la recherche de commande inversée de bash.

Il est disponible sur git-hub pour les curieux.


rock on gearoid
Darth Egregious

1

Je voudrais recommander ma ltcdpour une navigation rapide dans l'historique des répertoires:

https://github.com/dczhu/ltcd

cd demo gif

Il offre les fonctionnalités suivantes pour vous faciliter la vie:

  • Liste des répertoires globaux, qui affiche les répertoires récemment visités à partir de tous les onglets / fenêtres du terminal.
  • Liste des répertoires locaux, qui est locale à la session shell actuelle.
  • Les deux listes prennent en charge la navigation rapide en utilisant j / k (descendre / monter), les chiffres et la recherche de mots.
  • Saut gratuit mondial (par exemple "cd dir" ou "cd ar" pour aller dans / path / to / foo / bar / directory /).

1

J'ai créé un script qui a des fonctionnalités similaires à la commande oh-my-zshdirs -v qui fonctionne sur bash. Si vous avez déjà utilisé oh-my-zsh , vous avez peut-être remarqué que l'historique des répertoires fourni par la commande dirs -vsera réinitialisé à chaque fois que vous quittez le terminal. Cependant, cela ne se produira pas si vous utilisez ce script .

La fonctionnalité:

  • Afficher la liste des 10 répertoires utilisés les plus récents avec d.

  • Accédez à n'importe quel répertoire de la liste en tapant le numéro du répertoire dans la liste. Vous devez utiliser 0 au lieu de 10 pour accéder au 10e répertoire.

  • Un chemin de répertoire sera placé en haut de la liste chaque fois que vous utilisez v( vim ) pour modifier des fichiers ou o( xdg-open ) pour ouvrir un fichier à partir de ce répertoire. Ou si vous le souhaitez, chaque fois que vous visitez un annuaire.

Vous pouvez le voir en action ici .


0

Eh bien, vous pouvez ajouter cet extrait de code à votre ~/.bashrc, qui

  1. fournit une commande cd personnalisée

        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. et fournit une commande de recherche d'historique de cd.

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

Bien sûr, la commande cdhiste que j'ai fournie est très basique, et pas ce que vous vouliez; mais il est concevable d'utiliser des déclarations de cas ou une expansion de paramètres pour obtenir quelque chose de similaire à ce que vous voulez.

Vous pouvez même ajouter une fonction "Achèvement programmable", qui pourrait être utilisée pour ajouter la cd /path/to/mydircommande complète basée sur une sous-chaîne unique de /path/to/unique/mydir, bien que cette méthode vous obligerait à taper cd unique/mydir<tab>.


1
J'ai mal lu votre code et trouvé la dirscommande de bash qui fait essentiellement la même chose que my_dirs, mais sur une seule ligne.
idbrii

1
Cool. Donc non seulement bash le supporte; il le met en œuvre . J'aimerais avoir plus de temps pour étudier la magie profonde de bash. Bien sûr, cela ne prend en charge que la mémorisation de pushd, pas de cd. Mais je suppose que ce alias cd=pushdserait la forme la plus élégante.
jpaugh

0

Vous pouvez construire votre propre cdcommande avec pushd, popd, les dirs commandes internes.

Usage

  • cd -- (énumérer l'historique actuel)

  • cd -num (allez dans le répertoire num)

  • cd - (aller au répertoire précédent)


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

-1

J'ai assemblé cet outil, qui combine les solutions précédentes pour stocker un historique CLI global complet avec un outil d'interception interactif appelé percol (mappé sur C ^ R). Je l'utilise pour récupérer des commandes par où elles ont été exécutées ou pour trouver un répertoire par une commande. Il est toujours lisse sur la première machine que j'ai commencé à utiliser, maintenant avec un historique CLI> 2 ans.

L'outil grep fonctionne à la fois sur le chemin d'accès et sur la commande, mais peut toujours vous être utile. Voir aussi 'dirs -v' dans zsh

https://github.com/gawells/ariadne


cela stocke un historique CLI avec le chemin, la commande et la date. Ce n'est pas uniquement le chemin, mais il est toujours utile pour la recherche inversée de l'historique des répertoires (bash et zsh)
Gordon Wells

Je pense que vous avez oublié de créer un lien vers votre outil. D'après votre description, je soupçonne qu'il est déficient dans la mesure où les commandes ne fonctionnent que d'où elles sont invoquées. cd share/manNe fonctionne donc que si je suis déjà dans / usr.
idbrii

Oops! mon mauvais, je pensais avoir mis l'URL dans le texte, je n'ai pas remarqué que quelque chose n'allait pas
Gordon Wells
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.