Gibt es einen Verzeichnisverlauf für Bash?


26

Gibt es so etwas wie Bashs Reverse-Search-History (Strg-R), aber nur für Verzeichnisse?

Ich habe einige tiefe Ordnerhierarchien, zu denen ich springen möchte, also würde ich gerne etwas wie Reverse-Search-History verwenden, aber es sucht nur nach Ordnernamen und gibt mir absolute Pfade.

Im Wesentlichen würde dies zu ähnlichen Ergebnissen führen wie die Verwendung von !?Befehlen , die jedoch nur mit cd im Vordergrund übereinstimmen. Sie können die Ergebnisse schrittweise durchlaufen und vollständige Pfade angeben.

Die beste Lösung, die ich bisher gefunden habe, sind Bashmarks .


1
Ich habe vor kurzem angefangen, z zu verwenden, und das scheint bisher zu funktionieren, aber ich habe es für ein paar Pfade verwendet.
Rob

Antworten:


11

Schauen Sie sich Autojump an :

Einer der am häufigsten verwendeten Shell-Befehle ist "cd". Eine kurze Umfrage unter meinen Freunden ergab, dass zwischen 10 und 20% aller von ihnen eingegebenen Befehle tatsächlich CD-Befehle sind! Leider müssen Sie beim Wechseln von einem Teil Ihres Systems zu einem anderen mit cd fast den vollständigen Pfad eingeben, was nicht sehr praktisch ist und viele Tastatureingaben erfordert.

Autojump ist eine schnellere Möglichkeit, in Ihrem Dateisystem zu navigieren. Es funktioniert, indem eine Datenbank der Verzeichnisse, die Sie am häufigsten verwenden, über die Befehlszeile verwaltet wird. Der Befehl jumpstat zeigt Ihnen den aktuellen Inhalt der Datenbank an. Sie müssen ein wenig arbeiten, bevor die Datenbank verwendet werden kann. Sobald Ihre Datenbank einigermaßen vollständig ist, können Sie zu einem häufig verwendeten "cd" ed-Verzeichnis "springen", indem Sie Folgendes eingeben:
j dirspec


Dies kann zu Problemen mit dem Titel des Terminals führen .
Daniel Beck

6

Es gibt

cd -

Das ist der Befehl "cd [Leerzeichen] [Bindestrich]", der zu dem Verzeichnis wechselt, in dem Sie sich zuvor befanden, im Wesentlichen eine "Geschichte der Tiefe 1". Wiederholtes "cd -" wechselt zwischen zwei Verzeichnissen hin und her.

Zitierende Manpage:

Folgende Operanden sollen unterstützt werden: [...]

Wenn ein [Bindestrich] als Operand verwendet wird, muss dies dem folgenden Befehl entsprechen:

      cd "$OLDPWD" && pwd

Leider kenne ich kein echtes eingebautes Verzeichnisprotokoll.


Es gibt ein pushd dir popdPaar, das Ihren Verlaufsstapel von Verzeichnissen speichern kann. Dies ist sehr hilfreich bei Skripten, die in verschiedenen Ordnern ausgeführt werden.
Jakuje

Ich kenne pushdund popdund es wird hier auch schon erwähnt.
25.

3

bash hat pushd / popd / dirs. Ich habe dies in meinem .bashrc, um Verzeichnisse automatisch auf den Stack von bash zu pushen.

#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 diese mit popdund zeigen den Stapel mitdirs


2

Ich habe gute Erfahrungen mit Z-Jump gemacht. Es ermöglicht die Fertigstellung, allerdings nur für das endgültige Ziel, ohne einen Pfad zu durchlaufen. Es wird jedoch der vollständige Pfad nach Fertigstellung der Registerkarte angezeigt.


1

Um meine eigenen Erfahrungen einfließen zu lassen, habe ich vor einiger Zeit ein einfaches Skript geschrieben, um diese Anforderung zu erfüllen. Es überschreibt den eingebauten Befehl cd mit einer einfachen Funktion, mit der der neue Verzeichnispfad an eine Verlaufsdatei angehängt wird Stellen Sie eine Bash-Schnittstelle bereit, die eine geordnete Liste von Verzeichnissen dynamisch aktualisiert, wenn Sie Suchbegriffe eingeben, ähnlich wie bei der Rückwärtsbefehlssuche von Bash.

Es ist auf Git-Hub für diejenigen, die neugierig sind.


Rock on Gearoid
Darth Egregious

1

Ich möchte meine ltcdfür eine schnelle Navigation durch den Verzeichnisverlauf empfehlen :

https://github.com/dczhu/ltcd

CD Demo GIF

Es bietet die folgenden Funktionen, um das Leben zu erleichtern:

  • Globale Verzeichnisliste, in der die zuletzt besuchten Verzeichnisse aus allen Registerkarten / Fenstern des Terminals angezeigt werden.
  • Lokale Verzeichnisliste, die für die aktuelle Shell-Sitzung lokal ist.
  • Beide Listen unterstützen die schnelle Navigation mithilfe von j / k (runter / rauf), Zahlen und Wortsuche.
  • Globales Freispringen (zB "cd dir" oder "cd ar", um nach / path / to / foo / bar / directory / zu gehen).

1

Ich habe ein Skript erstellt , das eine ähnliche Funktionalität hat wie derdirs -v Befehl oh-my-zsh, der mit bash funktioniert. Wenn Sie jemals oh-my-zsh verwendet haben , ist Ihnen möglicherweise aufgefallen, dass der vom Befehl bereitgestellte Verzeichnisverlauf dirs -vbei jedem Verlassen des Terminals zurückgesetzt wird. Es wird jedoch nicht passieren, wenn Sie dieses Skript verwenden .

Die Funktionalität:

  • Zeigt die Liste der 10 zuletzt verwendeten Verzeichnisse mit an d.

  • Wechseln Sie zu einem beliebigen Verzeichnis in der Liste, indem Sie die Nummer des Verzeichnisses in die Liste eingeben. Sie müssen 0 anstelle von 10 verwenden, um zum 10. Verzeichnis zu springen.

  • Ein Verzeichnispfad wird jedes Mal an den Anfang der Liste gesetzt, wenn Sie v( vim ) zum Bearbeiten von Dateien oder o( xdg-open ) zum Öffnen einer Datei aus diesem Verzeichnis verwenden. Oder wenn Sie möchten, jedes Mal, wenn Sie ein Verzeichnis besuchen.

Sie können es hier in Aktion sehen .


0

Nun, man könnte diesen Code - Schnipsel hinzufügen Ihren ~/.bashrc, welcher

  1. Bietet einen benutzerdefinierten CD-Befehl

        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. und bietet einen CD-Verlaufs-Suchbefehl.

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

Natürlich ist der von mir bereitgestellte Befehl cdhist sehr einfach und nicht das, was Sie wollten. Es ist jedoch denkbar, case-Anweisungen oder Parametererweiterungen zu verwenden, um etwas zu erreichen, das Ihren Vorstellungen entspricht.

Sie könnten sogar eine "Programmierbare Vervollständigung" -Funktion hinzufügen, mit der Sie den vollständigen cd /path/to/mydirBefehl basierend auf einer eindeutigen Unterzeichenfolge von hinzufügen können /path/to/unique/mydir, obwohl für diese Methode weiterhin eine Eingabe erforderlich ist cd unique/mydir<tab>.


1
Ich habe Ihren Code falsch gelesen und den dirsBefehl von bash gefunden, der im Wesentlichen das Gleiche bewirkt wie my_dirs, jedoch in einer Zeile.
idbrii

1
Cool. Bash unterstützt es also nicht nur. es setzt es um. Ich wünschte, ich hätte mehr Zeit, um Bashs tiefe Magie zu studieren. Dies unterstützt natürlich nur das Erinnern an pushd, nicht an cd. Aber ich nehme an, das alias cd=pushdwäre die eleganteste Form.
Jpaugh

0

Sie können Ihre eigenen bauen cdBefehl mit pushd, popd, dirs gebautet Befehle.

Verwendung

  • cd -- (aktuelle Historie auflisten)

  • cd -num (gehe zum num Verzeichnis)

  • cd - (gehe zum vorherigen Verzeichnis)


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

Ich habe dieses Tool zusammengestellt, das frühere Lösungen zum Speichern eines umfassenden globalen CLI-Verlaufs mit einem interaktiven Grepping-Tool namens Percol (auf C ^ R abgebildet) kombiniert. Ich benutze es, um Befehle von wo sie ausgeführt wurden abzurufen oder um ein Verzeichnis von einem Befehl zu finden. Es ist auf dem ersten Computer, auf dem ich mit der Verwendung begonnen habe, immer noch ein Kinderspiel.

Das grep-Tool kann sowohl mit dem Pfad als auch mit dem Befehl verwendet werden, ist jedoch möglicherweise weiterhin nützlich für Sie. Siehe auch 'dirs -v' in zsh

https://github.com/gawells/ariadne


Hier wird ein CLI-Verlauf mit Pfad, Befehl und Datum gespeichert. Es ist nicht nur ein Pfad, aber dennoch nützlich für die Rückwärtssuche im Verlauf (Bash und Zsh)
Gordon Wells

Ich denke, Sie haben vergessen, auf Ihr Tool zu verlinken. Aus Ihrer Beschreibung würde ich vermuten, dass es mangelhaft ist, dass Befehle nur dort funktionieren, wo sie aufgerufen werden. Funktioniert also cd share/mannur, wenn ich schon in / usr bin.
Idbrii

Hoppla! Meine schlechte, ich dachte, ich würde die URL in den Text setzen, nicht bemerkt, dass etwas schief gelaufen ist
Gordon Wells
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.