¿Equivalente de alias para un enlace simbólico?

18

Me encuentro con la necesidad de saltar algunos directorios en mi carpeta de inicio a menudo y me canso de escribirlos. Me gustaría un enfoque más rápido, que tradicionalmente sería un enlace simbólico.

Sin embargo, no quiero saturar mi directorio de inicio con docenas de enlaces simbólicos. Podría crear un poco de ~/links/directorio y el desorden que con los enlaces simbólicos, pero todavía es feo. Además, es posible que desee crear enlaces simbólicos que cambien cada día (definido en .bashrc) para saltar al directorio de días actuales.

¿Hay alguna manera de alias de manera efectiva un enlace simbólico, creando algo que será reconocido como un enlace para una navegación rápida, pero que en realidad no aparecerá cuando haga uno lsde mi directorio de inicio, y no durará más allá de la sesión actual?

dsollen
fuente
44
es posible que desee mirar pushd y popd
Rui F Ribeiro
Creo que el enfoque de Jeroen Janssen es adaptable y de bajo costo para esta necesidad exacta: jeroenjanssens.com/2013/08/16/…
Theophrastus
2
¿Qué caparazón estás usando?
Gilles 'SO- deja de ser malvado'
@Theophrastus Heh: eso es básicamente lo que reimplementé no tan elegante en mi respuesta.
mattdm
3
no es exactamente lo que está buscando, pero aún podría ser útil cuando salte de un lado a otro entre dos directoresis: cd -will cden el último directorio anterior. Por lo tanto, si lo hace dos veces, volverá a donde comenzó ... muy agradable para la situación "oh, olvidé editar someFile.txt en la ubicación anterior" => Simplemente: cd -edite someFile.txtcd -
dingalapadum

Respuestas:

12

Podrías usar tabulación completa. De manera predeterminada en muchas distribuciones de Linux, bash está configurado para que cuando presione la tecla [TAB], se le dé una lista de posibles coincidencias, o si solo hay una coincidencia, se completará. Para cd, normalmente es una lista de subdirectorios del directorio de trabajo actual. Podrías sobrescribir eso, pero te sugiero que hagas un alias, como jd"jump directory":

alias jd=cd

y luego, definiendo los "marcadores" que desea como finalizaciones para jd. Mire la página de manual de bash para ver muchas más opciones (incluida la generación automática de los resultados sobre la marcha desde un comando o función), pero la forma más fácil es solo una lista de palabras, con -W:

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

Ahora, escriba jdy presione [TAB], y verá sus "marcadores". Escriba cualquier parte ambigua y luego presione [TAB] para completar. (En lo anterior, la ~s se expande a mi directorio de inicio, por lo que la primera [TAB] me da un /, y si presiono wy [TAB] nuevamente, /srv/wwwse completa.)

Por supuesto, pon esto ~/.bash_profilepara que persista.

O podemos llevar esto al siguiente nivel. Haga un directorio ~/.shortcuts, comenzando con un punto, estará oculto y no desordenará su directorio de inicio limpio y agradable, y llénelo con enlaces simbólicos a sus directorios deseados. Luego, pon esto en tu ~ / .bash_profile:

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

Esto define una finalización un poco más complicada en la función _list_shortcutspara construir la lista de nombres, y hace que jdsea ​​una función en lugar de un simple alias, ya que queremos que actúe de manera diferente a solo cd. La -Pbandera cdhace que resuelva los enlaces simbólicos, por lo que todo se vuelve magia transparente. Sus nombres de acceso directo ni siquiera tienen que coincidir con los objetivos.

Entonces:

$ 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

Y, para una dosis extra de fantasía, haga una jdlista de todos sus atajos cuando se ejecute sin ningún parámetro:

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

Nota: uso en compgen -W $( cmd )lugar de compgen -C 'cmd'porque este último nunca funciona para mí y no entiendo por qué. Esa podría ser una nueva pregunta mía. :)

mattdm
fuente
muy interesante. Sin embargo, aún requiere escribir el enlace completo, o al menos lo suficiente para que no sea ambiguo, antes de que pueda completar con jd. ¿Alguna forma de agregar alias a los comandos jd para acortarlos? o hacerlos relativos a un directorio donde puedo almacenar enlaces simbólicos, supongo.
dsollen
@dsollen Ver actualización :)
mattdm
Esto funcionó perfectamente. Honestamente, no esperaba una buena respuesta a esta pregunta, pero esto es exactamente lo que quería. Anticipo bastante uso de esto y se siente lo suficientemente limpio como para agregarlo a la lista de cosas que modifico cada vez que obtengo una nueva VM (incluso tengo una forma automatizada de clonar mis cambios ambientales estándar en un nuevo vm lol). Muchas gracias. En algún momento, cuando tenga más tiempo libre, descubriré cómo funciona la sintaxis de COMPREPLY;)
dsollen
18

Los alias de Shell tienen la característica de que puede completar (algunos) nombres (generalmente vinculados tab). Alternativamente, puede usar la CDPATHfunción, que "recientemente" (en los últimos 5-6 años) se ha mejorado para admitir la finalización del nombre. Si eso funciona para usted, tiene la ventaja de que lo que escribe es el nombre real del directorio en lugar de un mnemotécnico para él.

De acuerdo con el manual de bash

CDPATH
Una lista de directorios separados por dos puntos utilizados como ruta de búsqueda para el cdcomando integrado.

Otras lecturas:

Thomas Dickey
fuente
No sabía sobre el CDPATH variable de entorno, gracias. Podría agregar mi git_reposdirectorio a esa variable ...
Comodín
16

Para los directorios que frecuenta con frecuencia, pero que no cambia diariamente, otra opción es tener varios aliascomandos en su .bashrcarchivo:

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

Un amigo tiene alrededor de 50 de esos; Tengo un puñado Rapido y Facil. Sólo

cdo

cambiar el directorio a / u01 / app / oracle

Mark Stewart
fuente
En efecto. He usado este mecanismo desde principios de la década de 1990.
wallyk
7

Recomiendo pushdy popd.

Personalmente, los encuentro útiles cuando hago trabajo de desarrollo / leo el código fuente, cuando hay varios directorios involucrados.

Implementan efectivamente una estructura de pila / LIFO, donde EMPUJA un directorio (pushd ), y el siguiente comando de directorio POP ( popd) lo recupera.

Entonces, cuando está dentro de un directorio, haría:

pushd .

Y cuando necesitas recuperarlo, lo haces

popd

Puedes realizar múltiples pushd , y hacer las correspondientes popdmás tarde, para volver a los directorios.

Dejaré aquí un enlace.

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

Rui F Ribeiro
fuente
1
Esta es la solución que uso también, con la excepción de que no uso popdmucho. Completo mi dirslista (que se completa con pushdcomandos) con todos los directorios que quiero visitar / trabajar durante ese tiempo, luego ejecuto pushd +1. Entonces, puedo recorrer los directorios con un simple !puque es muy rápido. (Tenga en cuenta que tanto en Ubuntu como en CentOS, pushdes el único comando disponible en una instalación limpia que comienza con pu).
Comodín
3

Podrías simplemente ponerlos como variables en tu ~/.bashrc, y luego están a un paso de $distancia.

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

$ cd $myproj
Ewan Mellor
fuente
3

La respuesta obvia son las variables , esas cosas simbólicas en el shell que representan otras cosas, de manera similar a los enlaces simbólicos en el sistema de archivos.

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

En cualquier shell decente, se Tabcompletan los nombres de las variables, lo que ayuda aún más.

Kaz
fuente