Équivalent d'alias pour un lien symbolique?

18

Je me retrouve souvent à devoir parcourir quelques répertoires de mon dossier personnel et je me lasse de les écrire. J'aimerais une approche plus rapide, qui serait traditionnellement un lien symbolique.

Cependant, je ne veux pas encombrer mon répertoire personnel avec des dizaines de liens symboliques. Je pourrais créer des ~/links/répertoires et Clutter il avec des liens symboliques, mais il est toujours laid. En outre, je souhaiterais peut-être créer des liens symboliques qui changent chaque jour (définis dans .bashrc) pour passer au répertoire actuel.

Existe-t-il un moyen d'alias efficace un lien symbolique, créant quelque chose qui sera reconnu comme un lien pour une navigation rapide, mais n'apparaîtra pas réellement lorsque je ferai un lsde mon répertoire personnel et ne durera pas au-delà de la session en cours?

dsollen
la source
4
vous voudrez peut-être regarder pushd et popd
Rui F Ribeiro
je trouve l'approche de Jeroen Janssen adaptable et peu coûteuse pour ce besoin précis: jeroenjanssens.com/2013/08/16/…
Theophrastus
2
Quel shell utilisez-vous?
Gilles 'SO- arrête d'être méchant'
@Theophrastus Heh - c'est essentiellement ce que j'ai réimplémenté pas aussi élégamment dans ma réponse.
mattdm
3
pas exactement ce que vous recherchez, mais peut toujours être utile lorsque vous faites des allers-retours entre deux directoris: la cd -volonté cddans le dernier répertoire était précédemment. Par conséquent, si vous le faites deux fois, vous reviendrez à l'endroit où vous avez commencé ... très bien pour la situation "oh j'ai oublié de modifier someFile.txt à l'emplacement précédent" => Simplement cd -:, modifiez someFile.txtcd -
dingalapadum

Réponses:

12

Vous pouvez utiliser la complétion de tabulation. Par défaut sur de nombreuses distributions Linux, bash est configuré de sorte que lorsque vous appuyez sur la touche [TAB], vous obtenez une liste de correspondances possibles, ou s'il n'y a qu'une seule correspondance, tout est rempli. Pour cd, il s'agit normalement d'une liste de sous-répertoires du répertoire de travail actuel. Vous pouvez remplacer cela, mais je suggère plutôt de créer un alias, comme jdpour "jump directory":

alias jd=cd

puis, définissant les "signets" que vous souhaitez compléter pour jd. Regardez la page de manuel bash pour beaucoup plus d'options (y compris la génération automatique des résultats à la volée à partir d'une commande ou d'une fonction), mais le moyen le plus simple est juste une liste de mots, avec -W:

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

Maintenant, tapez jdet appuyez sur [TAB], et vous verrez vos "signets". Tapez n'importe quelle partie ambiguë, puis appuyez sur [TAB] pour terminer. (Dans ce qui précède, le ~s se développe dans mon répertoire personnel, donc le premier [TAB] me donne un /, et si je frappe wet [TAB] à nouveau, /srv/wwwest rempli.)

Bien sûr, mettez cela ~/.bash_profilepour le faire persister.

Ou, nous pouvons prendre cela au niveau suivant. Créez un répertoire ~/.shortcuts- en commençant par un point, il sera masqué et ne créera pas votre joli répertoire personnel propre - et remplissez-le avec des liens symboliques vers vos répertoires souhaités. Ensuite, mettez ceci dans votre ~ / .bash_profile:

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

Cela définit une complétion légèrement plus compliquée dans la _list_shortcutsconstruction de la liste des noms, et fait jdêtre une fonction plutôt qu'un simple alias, car nous voulons qu'il agisse différemment de juste cd. Le -Pdrapeau lui cdpermet de résoudre les liens symboliques, de sorte que tout devient une magie transparente. Vos noms de raccourcis n'ont même pas à correspondre aux cibles.

Donc:

$ 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

Et, pour une dose supplémentaire de fantaisie, faites la jdliste de tous vos raccourcis lorsqu'ils sont exécutés sans aucun paramètre:

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

Remarque: j'utilise compgen -W $( cmd )au lieu de compgen -C 'cmd'car ce dernier ne fonctionne jamais pour moi et je ne comprends pas pourquoi. Cela pourrait être une nouvelle question pour moi. :)

mattdm
la source
très intéressant. Cependant, il faut toujours taper le lien complet, ou au moins suffisamment de lien pour devenir non ambigu, avant de pouvoir terminer avec jd. Est-il possible d'ajouter des alias aux commandes jd pour les raccourcir? ou les faire par rapport à un répertoire où je peux stocker des liens symboliques, je suppose.
dsollen
@dsollen Voir la mise à jour :)
mattdm
cela a parfaitement fonctionné. En toute honnêteté, je ne m'attendais pas à une bonne réponse à cette question, mais c'est à peu près exactement ce que je voulais. J'anticipe un peu d'utilisation de cela et il semble suffisamment propre pour s'ajouter à la liste des choses que je modifie chaque fois que j'obtiens une nouvelle machine virtuelle (j'ai même un moyen automatisé de cloner mes changements environnementaux standard dans un nouveau vm lol). Merci beaucoup. À un moment donné, quand j'aurai plus de temps libre, je découvrirai comment fonctionne la syntaxe de COMPREPLY;)
dsollen
18

Les alias de shell ont la fonctionnalité que vous pouvez faire (une certaine) complétion de nom sur eux (généralement liés à tab). Alternativement, vous pouvez utiliser la CDPATHfonctionnalité, qui "récemment" (au cours des 5 à 6 dernières années) a été améliorée pour prendre en charge l'achèvement de nom. Si cela fonctionne pour vous, cela a l'avantage que ce que vous saisissez est le nom réel du répertoire plutôt qu'un mnémonique pour celui-ci.

Selon le manuel bash

CDPATH
Une liste de répertoires séparés par deux points utilisés comme chemin de recherche pour la cdcommande intégrée.

Lectures complémentaires:

Thomas Dickey
la source
Je ne connaissais pas la CDPATHvariable d'environnement, merci. Je pourrais ajouter mon git_reposrépertoire à cette variable ....
Wildcard
16

Pour les répertoires que vous fréquentez souvent, mais ne changez pas quotidiennement, une autre option consiste simplement à avoir plusieurs aliascommandes dans votre .bashrcfichier:

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

Un ami en a environ 50; J'en ai une poignée; rapide et facile. Juste

cdo

changer le répertoire en / u01 / app / oracle

Mark Stewart
la source
En effet. J'utilise ce mécanisme depuis le début des années 1990.
wallyk
7

Je recommande pushdet popd.

Personnellement, je les trouve pratiques lors de travaux de développement / lecture de code source, lorsque plusieurs répertoires sont impliqués.

Ils implémentent efficacement une structure de pile / LIFO, où vous POUSSEZ un répertoire ( pushd), et la prochaine commande de répertoire POP ( popd) le récupère.

Donc, à l'intérieur d'un répertoire, vous feriez:

pushd .

Et quand vous avez besoin de le récupérer, vous le faites

popd

Vous pouvez effectuer plusieurs opérations pushdet effectuer les opérations correspondantes popdultérieurement pour revenir aux répertoires.

Je vais laisser ici un lien.

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

Rui F Ribeiro
la source
1
C'est la solution que j'utilise également, à l'exception que je n'utilise pas popdbeaucoup. Je remplis ma dirsliste (qui est remplie de pushdcommandes) avec tous les répertoires que je veux visiter / travailler pendant ce laps de temps, puis je cours pushd +1. Ensuite, je peux parcourir les répertoires avec un simple !puqui est très rapide. (Notez que sur Ubuntu et CentOS, pushdest la seule commande disponible sur une installation propre qui commence par pu.)
Wildcard
3

Vous pouvez simplement les mettre en tant que variables dans votre ~/.bashrc, puis elles ne sont plus qu’à l’ $écart.

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

$ cd $myproj
Ewan Mellor
la source
3

La réponse évidente est les variables , ces choses symboliques dans le shell qui représentent d'autres choses, de la même manière que les liens symboliques dans le système de fichiers.

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

Dans tout shell décent, vous obtenez l' Tabachèvement des noms de variables, ce qui aide davantage.

Kaz
la source