"Lesezeichen" für Bash

24

Das Navigieren in mehreren Ebenen verschachtelter Verzeichnisse ist oft mühsam. Unter Firefox ist dies einfach, da sie Lesezeichen haben. Also, was ich tun möchte, um eine Datei mit Lesezeichen zu versehen, ist Folgendes einzugeben:

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

Um in dieses Verzeichnis zu gelangen, würde ich Folgendes eingeben:

$ go classes

Früher habe ich symbolische Links verwendet, um etwas Ähnliches zu erreichen, aber ich möchte mein Home-Verzeichnis nicht überladen. Es gibt viele andere Funktionen, die sich als nützlich erweisen könnten. Zum Beispiel möchte ich in der Lage sein, mit dem Tippen zu beginnen go clund dann die Tabulatortaste zu drücken, um automatisch zu vervollständigen. Manchmal habe ich mehrere Kopien eines Repositorys ausgecheckt und daher wäre es für das Programm nützlich, wenn ich mehrere Kontexte erstellen und das Lesezeichen relativ zum Kontextbasisverzeichnis setzen könnte.

Gibt es so etwas schon, bevor ich meine eigenen Skripte zusammenbaue?

Casebash
quelle
Siehe auch
Casebash
4
Wenn Sie weiterhin Bash mit Firefox vergleichen, wird jemand eine Awesomebar für Bash
erstellen

Antworten:

12

Ich habe zu lange nach einem Shell-Lesezeichen gesucht und bin mit keiner der Lösungen, die ich gefunden habe, zufrieden.

Schließlich bin ich jedoch auf ein großartiges, universelles Tool gestoßen: den Befehlszeilen-Fuzzy-Finder .

Sie können damit in erster Linie Dateien „unscharf finden“ (überprüfen Sie die reichhaltige GIF-Animation über den obigen Link), aber Sie können auch beliebige Textdaten eingeben und diese Daten filtern. Die Idee der Verknüpfungen ist also einfach: Alles, was wir brauchen, ist eine Datei mit Pfaden (die Verknüpfungen sind) zu pflegen und diese Datei mit einem Fuzzy-Filter zu versehen. So sieht es aus: Wir geben einen cdgBefehl ein (von "cd global", wenn Sie möchten), rufen eine Liste unserer Lesezeichen ab, wählen die erforderlichen in nur wenigen Tastenanschlägen aus und drücken die Eingabetaste. Das Arbeitsverzeichnis wird in das ausgewählte Element geändert:

cdg

Es ist extrem schnell und bequem: Normalerweise gebe ich nur 3-4 Buchstaben des gewünschten Artikels ein und alle anderen sind bereits ausgefiltert. Zusätzlich können wir uns natürlich mit den Pfeiltasten oder mit Ctrl+j/ durch die Liste bewegen Ctrl+k.

Ausführlicher Artikel zu dieser Lösung für Verknüpfungen / Lesezeichen ist hier: Fuzzy-Verknüpfungen für Ihre Shell .

Dmitry Frank
quelle
19

Ich denke, Sie suchen nach etwas wie Autojump . Sie müssen sich ein wenig umsehen, um eine Reihe von "Schlüsselgewichten" zu entwickeln, die mit der in einem bestimmten Verzeichnis verbrachten Zeit korrelieren. Wenn Sie dann viel Zeit in diesem "Klassen" -Verzeichnis verbracht haben, können Sie direkt dorthin springen, indem Sie etwas eingeben

j cl

Mit können Sie Ihre "Schlüsselgewichte" einsehen

jumpstat
tcdyl
quelle
Ich fand kürzlich ein etwas komplexeres, aber interessanteres und verwandtes Tool namens f: github.com/clvv/f
tcdyl
14

Wie erwähnt, sind Aliase ein guter Mechanismus. Die bash hat auch einen eingebauten Mechanismus rechts zu einer Stelle zu springen: CDPATH. Stellen Sie es so ein PATH, aber es wird verwendet, cdanstatt nach Programmen zu suchen.

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

Aus der Manpage:

   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".

Ich selbst habe dies mit einem Verzeichnis kombiniert, das Symlinks zu dem enthält, wohin ich gehen möchte:

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

Dies hat den Nachteil, dass das Verzeichnis nicht ganz korrekt zu sein scheint, aber mit cd -Poder Einstellung korrigiert werden kann set -P.

Arcege
quelle
CDPATH ist interessant, aber es lohnt sich wahrscheinlich, einen separaten go-Befehl zu verwenden, damit das Verhalten immer vorhersehbar ist
Casebash
1
+1 für die Menge -P. Einige meiner Symlinks haben mich in den Wahnsinn getrieben, weil ich mich nicht erinnern konnte, wohin sie wirklich gingen, und mich nicht an den Befehl erinnerte, der diese Informationen anzeigt.
Joe
@ Joe, ich würde alias C='cd -P .'eher als hinzufügen set -P, da für System-Symlinks es mir nichts ausmacht, im Symlink-Verzeichnis zu sein.
Wildcard
@Wildcard - interessant - könntest du ein Beispiel geben, wo dies für dich einen Unterschied macht? Ich bin gerade gelaufen help cdund verstehe immer noch nicht, was die Option -P bewirkt.
Joe
@ Joemkdir test; ln -s test linktotest; cd linktotest; pwd; cd -P .; pwd
Wildcard
9

Sie können die vorhandenen Funktionen von Bash zur Suche nach Verlauf und Verlauf kombinieren. Drücken Sie Ctrl-R, um die inkrementelle Rückwärtssuche zu starten, und geben Sie dann den Teil des Pfads ein, der wahrscheinlich eindeutig ist.

Sie können so lange Buchstaben eingeben, bis Sie wieder den letzten cdBefehl für dieses Verzeichnis Ctrl-Reingegeben haben , oder Sie können erneut drücken , um zum nächsten Befehl im Verlauf zu springen, der Ihren bisherigen Eingaben entspricht.

Ich mache das die ganze Zeit.

Eigentlich gehe ich noch einen Schritt weiter. Sobald ich anfange, Sequenzen von Befehlen zu entdecken, die es wert sind, in der Geschichte festgehalten zu werden, die es jedoch nicht wert sind, sich auf ein Shell-Skript festzulegen, fange ich an, sie mit &&und ;Kombinatoren zu verketten, damit ich in umgekehrter Reihenfolge nach einem Teil dieses einen langen Befehls suchen Enterund die gesamte Sequenz ausführen kann Einmal.

So erstelle und führe ich beispielsweise eines meiner Programme während der Entwicklung aus:

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

Ich mache dies aus dem Installationsverzeichnis, das sich unter dem Quellverzeichnis der obersten Ebene befindet. Indem cdich das Teil in eine Sub-Shell einhülle , baue und installiere, stelle ich sicher, dass ich, egal was während dieses Vorgangs passiert, wieder in meiner normalen Shell lande, ohne dass sich etwas ändert. Erst wenn das gelingt (&&), starte ich das erstellte und installierte Programm. Ich kann mit nur dies in meiner Geschichte finden Ctrl-Rdann sta, dass ist alles , was ich in der Regel eindeutig müssen diese Befehlsfolge finden.

Ein weiteres Beispiel, wie ich dies benutze, ist die Sequenz, in der RPMs für dasselbe Programm erstellt werden. Der größte Teil der mühsamen Arbeit liegt in Shell-Skripten, aber es gibt immer noch ein paar Befehle, die ich normalerweise eingeben muss, um die gesamte Arbeit des Erstellens und Bereitstellens der erstellten RPMs zu erledigen, die ich jetzt selten neu eingeben muss, da Bash beibehalten wird es in der Geschichte für mich.

Kombinieren Sie all dies mit export HISTSIZE=bignumund, shopt histappendund Sie haben gerade einen elephantine-Befehlsspeicher erstellt.

Eine andere Lösung, die ich einmal codiert habe, ist meine Antwort auf eine andere Frage hier . Es muss möglicherweise für Ihre Zwecke angepasst werden und verarbeitet nur cdBefehle, wohingegen die Verlaufssuchoption überall und für jeden Befehl funktioniert.

Warren Young
quelle
6

Ich selbst benutze aliases, lange Wege zu verkürzen, die ich oft besuche. Sie können Ihren Satz von aliases in Ihrem bashrcablegen, so dass sich bash jedes Mal daran erinnert, wenn Sie sich anmelden. Und zum Glück fügt bash Aliase zur automatischen Vervollständigung hinzu.

Ich würde so etwas für Ihren Fall schreiben: alias go-classes="cd ~/repo/www/public/util/classes"

saeedn
quelle
6

Möglicherweise suchen Sie nach Bashmarks (auf Github).
Aus der README:

Bashmarks ist ein Shell-Skript, mit dem Sie häufig verwendete Verzeichnisse speichern und zu diesen springen können. Unterstützt jetzt die Tab-Vervollständigung.

Giuseppe Rota
quelle
4

Dies ist in keiner Weise vollständig oder narrensicher, sondern zunächst nur ein Entwurf. Wenn Sie Folgendes hinzufügen, stehen ~/.bashrcIhnen drei Befehle zum Hinzufügen von Lesezeichen zum Löschen und Auflisten von Verzeichnissen zur Verfügung (die auf Shell-Aliasen basieren, sodass Sie auch eine Art automatische Vervollständigung erhalten).

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
}

Die Bedienung ist ziemlich einfach. bmaddMit einem Argument wird ein nach dem Argument benannter Alias ​​hinzugefügt. Dieser Alias ​​erstellt nur eine CD mit dem Verzeichnis, in dem er festgelegt wurde. Ohne Argument wird der aktuelle Verzeichnisname als Aliasname verwendet. bmdelLöscht auf ähnliche Weise einen Alias, falls vorhanden, und bmlistlistet die aktuellen Lesezeichen auf.

z.B

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
quelle
4

Ich bin vor einiger Zeit auf dasselbe Bedürfnis gestoßen und habe beschlossen, ein paar Skripte zusammenzustellen, um mir zu helfen, absolute / relative Pfade zu markieren und sie kürzeren Namen zuzuordnen, an die ich mich leicht erinnern kann.

Das Skript ist sehr einfach zu verwenden und erstellt einfach eine Funktion mit dem Kurznamen, den Sie als Alias ​​für das Verzeichnis angeben, in das Sie springen möchten. Alles, was Sie tun müssen, ist einfach diesen Kurznamen einzugeben und es wird Sie zu dem mit einem Lesezeichen versehenen Verzeichnis weiterleiten.

Hier ist ein Link zur Quelle des Lesezeichen-Skripts. Übrigens, ich habe es The Bookmarker genannt.

Verwendung

Einmal installiert, ist es ziemlich einfach zu bedienen.

So markieren Sie ein Verzeichnis:

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

So navigieren Sie zu einem markierten Verzeichnis:

$ mydir

So sehen Sie, was markiert wurde:

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

So löschen Sie ein markiertes Verzeichnis:

$ umark myDir

Weitere Beispiele, Installationsanweisungen usw. finden Sie in der sehr ausführlichen Dokumentation .

Hass Joseph K.
quelle
3

cdargs ist das beste Tool für Verzeichnis-Lesezeichen.

Verwendungsbeispiele finden Sie in den Lesezeichen für das CD-Befehlsvideo auf YouTube.

Beispielanwendung

cdargsist eine ncurses-GUI, mit der Sie visuell in Ihrer Shell navigieren können. Sobald es installiert ist, richten Sie es in einer bestimmten Shell ein, indem Sie ein Shell-Skript verwenden:

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

Dies aktiviert verschiedene Funktionen, die Sie dann von Ihrer Shell aus aufrufen können.

Beschwöre die GUI:

$ cv

Daraus ergibt sich ein GUI-Typ:

   [.       ]  /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

Mit den Pfeiltasten können Sie in der Liste nach oben und unten navigieren. Der linke Pfeil ( ) geht eine Ebene in der Verzeichnisstruktur nach oben, ein rechter Pfeil ( ) führt einen Drilldown in ein Verzeichnis durch.

Verzeichnisse markieren:

Sie können entweder cdas aktuelle Verzeichnis verwenden, in dem Sie navigieren, oder adas Verzeichnis hinzufügen, das Sie gerade mit dem Cursor markieren.

Betriebsarten:

cdargsist in dieser Hinsicht ein bisschen wie vi / vim, wo es diesen Begriff von Modi hat . Es gibt zwei davon: Durchsuchen (B) und Auflisten (L). Sie können sehen, in welchem ​​Modus Sie sich befinden, indem Sie auf das Display unten in Ihrer Shell klicken.

Listungsmodus:

L: /home/saml/tst/88038

Browsermodus:

B: /home/saml/tst/88038

Sie können den Modus ändern, indem Sie die Tabulatortaste ( TAB) drücken .

Dies ist nur die Spitze des Eisbergs. man cdargsWeitere Informationen finden Sie in der Manpage ( ) und in der integrierten Hilfe.

Emon
quelle
2

Das beste Werkzeug dafür ist: wcd . Ich habe viele andere Tools getestet, und dieses wird genau so verwendet, wie Sie es wünschen. Es ist in vielerlei Hinsicht besser als alle vorherigen Lösungen.

Daniel Fanjul
quelle
1

Die anderen Antworten sind großartig und spezifisch. Eine andere Sichtweise ist die Verwendung eines Tastaturmakroprozessors, der fast alles kann, was Sie sich vorstellen können.

Testen Sie AutoKey. Es kann Phrasen wie die Autokorrektur oder den Bash-Verlauf eines Textverarbeitungsprogramms ersetzen und ein Python-Skript auf einem von Ihnen definierten Hotkey ausführen, das fast alles kann und Tastatureingaben an Ihr Zeicheneingabegerät sendet - so, als ob Sie sie eingegeben hätten.

Das einzige "Manko", das es (in Bezug auf diese Frage) hat, ist, dass es eine GUI benötigt, um in gnome oder kde zu laufen. Die anderen Antworten haben diese Anforderung nicht.

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

Es gibt eine andere Alternative namens z .

Es lernt bei jedem Verzeichniswechsel:

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

Dann können Sie später mit Fuzzy Matching in dieses Verzeichnis wechseln:

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

Apparix ist ein weiteres Tool, das dies tut. Eine der nützlichen Funktionen ist, dass Sie direkt zu den Unterverzeichnissen der Marke springen und in diesen Unterverzeichnissen die Tabulatoren vervollständigen können.

micans
quelle
0

Eine andere Lösung, die ich glaube, ist autojumpund zist fasd.

Es protokolliert, welche Verzeichnisse Sie besuchen, und z dir-namewechselt in das Verzeichnis mit dem Namen dir-name, den Sie am häufigsten verwenden. Es hat auch einige Funktionen für häufig verwendete Dateien.

Sie können es von folgender Adresse klonen: https://github.com/clvv/fasd

Die Installation ist unkompliziert, klonen, installieren und dann ändern Sie Ihre .bashrc(oder .zshrcetc).

Jonathan
quelle
0

Sie müssen Ihrem .bashrcoder einen Alias ​​hinzufügen .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

Angenommen, Sie möchten eine Verknüpfung zu ~/Desktop/Coding/Projectsdem aufzurufen, was Sie eingeben goto_Projs. Sie müssen der im Texteditor geöffneten Datei die folgende Zeile hinzufügen:

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

Jetzt tun Sie, was Ihr Texteditor von Ihnen verlangt, um zu speichern ( /User/<yourusername>/oder ~/natürlich) und zu beenden. Wenn die Shell-Eingabeaufforderung zurückgegeben wird, gehen Sie

source ~/.bash_profile

Ihr Alias ​​sollte nun wie oben beschrieben zum Aufrufen verfügbar sein.

Nathan P. Keene
quelle
0

Ich benutze die Methode, einen Kommentar am Ende des Befehls anzufügen und dann aufzurufen ctrl R, um die Suche nach dem Kommentar umzukehren. Dies hat folgende Vorteile:

  • Suche nach einem Befehl in natürlicher Sprache
  • Sie können den Kommentar jederzeit ändern und erhalten das neueste Update von ctrl R
  • verwenden ctrl R und tabon the fly, um kleinere Änderungen am Befehl selbst vorzunehmen, sodass der Kommentar eine Art allgemeine Verknüpfung zu einer Familie ähnlicher Befehle darstellt
  • Keine Setups, Installationen oder Buchhaltung erforderlich :-)
erav
quelle