Entspricht dem Alias ​​für einen symbolischen Link?

18

Ich muss oft in ein paar Verzeichnissen in meinem Home-Ordner herumspringen und habe es satt, sie zu schreiben. Ich hätte gerne einen schnelleren Ansatz, der traditionell eine symbolische Verbindung darstellt.

Ich möchte mein Home-Verzeichnis jedoch nicht mit Dutzenden symbolischen Links überladen. Ich könnte ein ~/links/Verzeichnis erstellen und es mit symbolischen Links überladen, aber es ist immer noch hässlich. Außerdem möchte ich möglicherweise symbolische Links erstellen, die sich jeden Tag ändern (in .bashrc definiert), um zum aktuellen Tageverzeichnis zu springen.

Gibt es eine Möglichkeit, einen symbolischen Link effektiv als Alias ​​zu kennzeichnen, wodurch ein Link erstellt wird, der als Link für die schnelle Navigation erkannt wird, aber nicht tatsächlich angezeigt wird, wenn ich einen lsVorgang in meinem Ausgangsverzeichnis durchführe, und nicht länger als die aktuelle Sitzung dauert?

dsollen
quelle
4
Vielleicht möchten Sie in Pushd und Popd suchen
Rui F Ribeiro
Ich finde Jeroen Janssens Ansatz anpassungsfähig und kostengünstig für genau dieses Bedürfnis: jeroenjanssens.com/2013/08/16/…
Theophrastus
2
Welche Shell benutzt du?
Gilles 'SO- hör auf böse zu sein'
@Theophrastus Heh - das habe ich im Grunde genommen in meiner Antwort nicht ganz so elegant umgesetzt.
Mattdm
3
nicht genau das, wonach du suchst, aber dennoch nützlich sein könnte, wenn du zwischen zwei directors hin und her springst: cd -will cdin das letzte verzeichnis wo vorher. Wenn Sie es also zweimal machen, kehren Sie zu Ihrem Ausgangspunkt zurück ... sehr schön für die Situation "Oh, ich habe vergessen, someFile.txt am vorherigen Speicherort zu bearbeiten" => Einfach: cd -someFile.txt bearbeitencd -
dingalapadum

Antworten:

12

Sie können die Tab-Vervollständigung verwenden. Bei vielen Linux-Distributionen ist bash standardmäßig so konfiguriert, dass beim Drücken der [TAB] -Taste eine Liste möglicher Übereinstimmungen angezeigt wird. Wenn nur eine Übereinstimmung vorhanden ist, ist alles ausgefüllt. Bei CDs ist dies normalerweise eine Liste von Unterverzeichnissen des aktuellen Arbeitsverzeichnisses. Sie könnten das überschreiben, aber ich schlage vor, stattdessen einen Alias jdfür "jump directory" zu erstellen:

alias jd=cd

und dann definieren Sie die "Lesezeichen", die Sie als Vervollständigungen für jd möchten. In der bash-Manpage finden Sie viele weitere Optionen (einschließlich der automatischen Generierung der Ergebnisse im Handumdrehen aus einem Befehl oder einer Funktion). Der einfachste Weg ist jedoch eine Liste von Wörtern mit -W:

complete -W "/ srv / www ~ / tmp ~ / work" jd

Nun geben jdund Hit [TAB], und Sie werden Ihre „Lesezeichen“ sehen. Geben Sie einen mehrdeutigen Teil ein und drücken Sie dann [TAB], um den Vorgang abzuschließen. (Im obigen Beispiel wird das ~s in mein Home-Verzeichnis erweitert, sodass mir das erste [TAB] ein gibt. /Wenn ich drücke wund erneut [TAB], /srv/wwwwird es ausgefüllt.)

Setzen Sie dies natürlich ein, ~/.bash_profiledamit es bestehen bleibt.

Oder wir können dies auf die nächste Ebene bringen. Erstellen Sie ein Verzeichnis ~/.shortcuts- beginnend mit einem Punkt, wird es ausgeblendet und muss Ihr schönes, sauberes Home-Verzeichnis nicht auflösen - und füllen Sie dieses mit Symlinks zu Ihren gewünschten Verzeichnissen. Dann fügen Sie dies in Ihr ~ / .bash_profile ein:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

Dies definiert eine etwas kompliziertere Vervollständigung in der Funktion _list_shortcutszum Erstellen der Namensliste und macht jdeine Funktion und keinen einfachen Alias, da wir wollen, dass sie anders als nur funktioniert cd. Das -PFlag cd, mit dem die Symlinks aufgelöst werden sollen, macht alles zu transparenter Magie. Ihre Verknüpfungsnamen müssen nicht einmal mit den Zielen übereinstimmen.

So:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

Und für eine Extraportion Phantasie sollten Sie jdalle Verknüpfungen auflisten, wenn Sie ohne Parameter ausgeführt werden:

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

Hinweis: Ich benutze compgen -W $( cmd )stattdessen, compgen -C 'cmd'weil letzteres bei mir nie funktioniert und ich nicht verstehe, warum. Das könnte eine neue Frage von mir sein. :)

mattdm
quelle
sehr interessant. Ein Haken dabei ist, dass der gesamte Link oder zumindest ein Teil des Links noch ausgeschrieben werden muss, um nicht mehrdeutig zu werden, bevor ich mit jd fertig werden kann. Gibt es eine Möglichkeit, den jd-Befehlen Aliase hinzuzufügen, um sie zu verkürzen? Oder machen Sie sie relativ zu einem Verzeichnis, in dem ich symbolische Links speichern kann, nehme ich an.
Dsollen
@dsollen Siehe Update :)
mattdm
das hat einwandfrei funktioniert. Ehrlich gesagt habe ich keine gute Antwort auf diese Frage erwartet, aber das ist ziemlich genau das, was ich wollte. Ich gehe davon aus, dass dies einiges genutzt wird, und es fühlt sich sauber genug an, um es zu der Liste der Dinge hinzuzufügen, die ich ändere, wenn ich eine neue VM erhalte. Vielen Dank. Irgendwann , wenn ich mehr freie Zeit habe , werde ich herausfinden , wie die Syntax für die COMPREPLY funktioniert;)
dsollen
18

Shell-Aliase haben die Funktion, mit der Sie (einige) Namensvervollständigungen vornehmen können (normalerweise gebunden an tab). Alternativ können Sie die CDPATHFunktion verwenden, die "kürzlich" (in den letzten 5-6 Jahren) verbessert wurde, um die Namensvervollständigung zu unterstützen. Wenn das für Sie funktioniert, hat es den Vorteil, dass das, was Sie eingeben, der tatsächliche Name des Verzeichnisses ist und keine Mnemonik dafür.

Nach dem Bash-Handbuch

CDPATH
Eine durch Doppelpunkte getrennte Liste von Verzeichnissen, die als Suchpfad für den cdintegrierten Befehl verwendet werden.

Weitere Lektüre:

Thomas Dickey
quelle
Wusste nichts über die CDPATHUmgebungsvariable, danke. Ich könnte mein git_reposVerzeichnis zu dieser Variablen hinzufügen ....
Wildcard
16

Für die Verzeichnisse, die Sie häufig benutzen, aber nicht täglich ändern, können Sie auch mehrere aliasBefehle in Ihre .bashrcDatei aufnehmen:

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

Ein Freund hat ungefähr 50 davon; Ich habe eine Handvoll; schnell und einfach. Gerade

cdo

um das Verzeichnis in / u01 / app / oracle zu ändern

Mark Stewart
quelle
Tatsächlich. Ich habe diesen Mechanismus seit den frühen neunziger Jahren verwendet.
Wallyk
7

Ich empfehle pushdund popd.

Ich persönlich finde sie praktisch, wenn ich Entwicklungsarbeit mache / Quellcode lese, wenn mehrere Verzeichnisse beteiligt sind.

Sie implementieren effektiv eine Stapelstruktur / LIFO, in der Sie ein Verzeichnis DRÜCKEN ( pushd) und das nächste POP-Verzeichnis mit dem Befehl ( popd) abrufen.

Wenn Sie sich also in einem Verzeichnis befinden, würden Sie Folgendes tun:

pushd .

Und wenn Sie es abrufen müssen, tun Sie es

popd

Sie können mehrere pushd(s) ausführen und die entsprechenden popd(s) später ausführen , um zu den Verzeichnissen zurückzukehren.

Ich werde hier einen Link hinterlassen.

http://www.eriwen.com/bash/pushd-and-popd/

Rui F Ribeiro
quelle
1
Dies ist die Lösung, die ich auch benutze, mit der Ausnahme, dass ich nicht popdviel benutze . Ich fülle meine dirsListe (die mit pushdBefehlen gefüllt ist ) mit allen Verzeichnissen, die ich für diesen Teil der Zeit besuchen / bearbeiten möchte, und führe sie dann aus pushd +1. Dann kann ich mit einem einfachen !pu, sehr schnellen Befehl durch die Verzeichnisse blättern. (Beachten Sie, dass sowohl unter Ubuntu als auch unter CentOS pushdder einzige Befehl für eine Neuinstallation ist, der mit beginnt pu.)
Wildcard
3

Sie könnten sie einfach als Variablen in Ihre einfügen ~/.bashrc, und dann sind sie nur noch einen $Schritt entfernt.

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj
Ewan Mellor
quelle
3

Die offensichtliche Antwort sind Variablen , jene symbolischen Dinge in der Shell, die für andere Dinge stehen, ähnlich wie symbolische Links im Dateisystem.

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

In jeder anständigen Shell werden die TabVariablennamen vervollständigt, was weiter hilft.

Kaz
quelle