"Marcadores" para bash

24

Navegar por varias capas de directorios anidados es a menudo un dolor. En Firefox, es fácil porque tienen marcadores. Entonces, lo que me gustaría hacer para marcar un archivo es escribir:

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

Luego, para ir a este directorio, escribiría:

$ go classes

Anteriormente he usado enlaces simbólicos para lograr algo similar, pero no quiero saturar mi directorio de inicio. Hay muchas otras características que podrían resultar útiles. Por ejemplo, me gustaría poder comenzar a escribir go cly luego presionar la pestaña para autocompletar. A veces tengo varias copias de un repositorio desprotegido, por lo que sería útil para el programa permitirme crear múltiples contextos y establecer el marcador en relación con el directorio base de contexto.

Entonces, antes de comenzar a armar mi propio conjunto de guiones, ¿ya hay algo como esto?

Casebash
fuente
44
Si sigues comparando bash con firefox, alguien hará una
barra impresionante

Respuestas:

12

Estuve buscando una herramienta de marcadores de shell durante demasiado tiempo, y no estoy satisfecho con ninguna de las soluciones que encontré.

Sin embargo, eventualmente me encontré con una gran herramienta universal: el buscador difuso de línea de comandos .

Principalmente le permite "encontrar difusamente" archivos (verifique la rica animación GIF en el enlace de arriba), pero también le permite enviar datos de texto arbitrarios y filtrar estos datos. Entonces, la idea de los accesos directos es simple: todo lo que necesitamos es mantener un archivo con rutas (que son accesos directos) y filtrar este archivo de forma difusa. Así es como se ve: escribimos el cdgcomando (desde "cd global", si lo desea), obtenemos una lista de nuestros marcadores, seleccionamos el necesario con solo presionar unas pocas teclas y presionamos Enter. El directorio de trabajo cambia al elemento seleccionado:

cdg

Es extremadamente rápido y conveniente: generalmente solo escribo 3-4 letras del elemento necesario, y todos los demás ya están filtrados. Además, por supuesto, podemos movernos por la lista con las teclas de flecha o con Ctrl+j/ Ctrl+k.

El artículo detallado sobre esta solución de accesos directos / marcadores está aquí: accesos directos difusos para su shell .

Dmitry Frank
fuente
19

Creo que estás buscando algo como autojump . Debe desarrollar un poco de CD para desarrollar un conjunto de "pesos clave" que se correlacionen con la cantidad de tiempo que se pasa en un directorio dado. Luego, suponiendo que haya pasado mucho tiempo en ese directorio de 'clases', puede saltar directamente escribiendo

j cl

Puede ver sus "pesos clave" con

jumpstat
tcdyl
fuente
Recientemente encontré una herramienta un poco más compleja, pero interesante y relacionada, llamada f: github.com/clvv/f
tcdyl
14

Como dice saeedn, los alias son un buen mecanismo. La cáscara del golpe también tiene un mecanismo incorporado para saltar directamente a una ubicación: CDPATH. Ajústelo como PATH, pero se usa en cdlugar de buscar programas.

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

Desde la página del manual:

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

Yo mismo, he combinado esto con un directorio que tiene enlaces simbólicos a donde me gustaría ir:

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

Esto tiene el inconveniente de que el directorio no parece ser correcto, pero puede rectificarse usando cd -Po configurando set -P.

Arcege
fuente
CDPATH es interesante, pero es probable que vale la pena utilizar un comando separado marcha para que el comportamiento es siempre predecible
Casebash
1
+1 para el conjunto -P. Algunos de mis enlaces simbólicos me estaban volviendo loco porque no podía recordar adónde fueron realmente y no recordaba el comando que muestra esa información.
Joe
@ Joe, agregaría en alias C='cd -P .'lugar de hacerlo set -P, ya que para los enlaces simbólicos del sistema no me importa estar en el directorio de enlaces simbólicos.
Comodín el
@Wildcard, interesante, ¿podría dar un ejemplo en el que esto marque la diferencia? Acabo de correr help cdy todavía no entiendo lo que hace la opción -P.
Joe
@ Joemkdir test; ln -s test linktotest; cd linktotest; pwd; cd -P .; pwd
Comodín
9

Puede combinar las funciones de búsqueda de historial e historial existentes de Bash. Presione Ctrl-Rpara comenzar la búsqueda inversa incremental, luego comience a escribir la parte de la ruta más probable que sea única.

Puede seguir escribiendo letras hasta que termine en el cdcomando más reciente que involucra ese directorio, o puede presionar Ctrl-Rnuevamente para volver al historial al siguiente comando más nuevo que coincida con lo que ha escrito hasta ahora.

Hago esto todo el tiempo.

En realidad, lo llevo un paso más allá. Una vez que empiezo a descubrir secuencias de comandos que vale la pena mantener en el historial pero que no vale la pena comprometer con un script de shell, empiezo a encadenarlos &&y ;combinarlos para poder realizar una búsqueda inversa de una subcadena de ese comando largo, presionar Entery ejecutar toda la secuencia en una vez.

Por ejemplo, así es como construyo y ejecuto uno de mis programas durante el desarrollo:

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

Lo hago desde el directorio de instalación, que se encuentra debajo del directorio de origen de nivel superior. Al envolver la parte cd, construir e instalar en un subconjunto, me aseguro de que, sin importar lo que ocurra durante este proceso, termine de nuevo en mi shell normal sin cambiar nada. Solo si eso tiene éxito (&&) puedo iniciar el programa construido e instalado. Puedo encontrar esto en mi historia con solo un Ctrl-Rmomento sta, que es todo lo que necesito generalmente para encontrar de manera única esta secuencia de comandos.

Otro ejemplo de cómo uso esto es la secuencia que entra en la construcción de RPM para este mismo programa. La mayor parte del trabajo tedioso está en scripts de shell, pero todavía hay algunos comandos que normalmente tendría que escribir para hacer todo el trabajo de construir y desplegar los RPM construidos, que ahora rara vez tengo que volver a escribir, porque Bash mantiene en la historia para mi.

Combine todo esto con export HISTSIZE=bignumy shopt histappendy que acaba construido una memoria de elefante de comandos.

Otra solución que codifiqué una vez está en mi respuesta a otra pregunta aquí . Es posible que deba adaptarse para sus propósitos, y solo maneja cdcomandos, mientras que la opción de búsqueda de historial funciona en todas partes y para cada comando.

Warren Young
fuente
6

Yo mismo uso aliaspara acortar caminos largos que visito a menudo. Puede poner su conjunto de aliases en su bashrc, para que bash pueda recordarlos cada vez que inicie sesión. Y afortunadamente bash agrega alias para autocompletar.

Escribiría algo como esto para su caso: alias go-classes="cd ~/repo/www/public/util/classes"

saeedn
fuente
6

Quizás estés buscando bashmarks (en github).
Desde el archivo Léame:

Bashmarks es un script de shell que le permite guardar y saltar a directorios de uso común. Ahora admite la finalización de pestañas.

Giuseppe Rota
fuente
4

Esto no está completo ni es infalible, solo un borrador para comenzar. Al agregar lo siguiente en su ~/.bashrc, tendrá tres comandos para agregar eliminar y enumerar los marcadores del directorio (que se basan en alias de shell, por lo que también obtendrá la finalización automática).

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
}

El uso es bastante simple. bmaddcon un argumento agrega un alias con el nombre del argumento. Este alias solo crea un CD en el directorio en el que se estableció. Sin un argumento, utiliza el nombre de directorio actual como el nombre del alias. De manera similar, bmdelelimina un alias si existe y bmlistenumera los marcadores actuales.

p.ej

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

Me encontré con la misma necesidad hace un tiempo y decidí reunir un par de guiones para ayudarme a marcar rutas absolutas / relativas y asignarlas a nombres más cortos que pueda recordar fácilmente.

El script es muy fácil de usar y simplemente creará una función con el nombre corto que proporcione como un alias al directorio en el que desea saltar. Todo lo que necesita hacer es simplemente escribir ese nombre corto y lo llevará al directorio marcado.

Aquí hay un enlace a la fuente del script marcador. Por cierto, lo llamé The Bookmarker.

Uso

Una vez instalado, es bastante trivial de usar.

Para marcar un directorio:

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

Para navegar a un directorio marcado:

$ mydir

Para ver lo que se ha marcado:

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

Para eliminar un directorio marcado:

$ umark myDir

Para obtener más ejemplos, instrucciones de instalación, etc., consulte la documentación muy detallada .

Hass Joseph K.
fuente
3

cdargs es la mejor herramienta para marcar el directorio.

Para ver ejemplos de uso, consulte los marcadores del video del comando cd en YouTube.

Ejemplo de uso

cdargses una GUI ncurses para que pueda navegar visualmente dentro de su shell. Una vez que está instalado, lo configura en un shell determinado obteniendo un script de shell:

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

Esto habilita varias funciones a las que puede llamar desde su shell.

Invocar la GUI:

$ cv

Resultando en este tipo de GUI:

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

Puede usar las teclas de flecha para moverse hacia arriba y hacia abajo para navegar por la lista. La flecha izquierda ( ) sube un nivel en el árbol de directorios, una flecha derecha ( ) profundizará en un directorio.

marcando directorios:

Puede usar cel directorio actual que está navegando o puede aagregar el directorio que está resaltando actualmente con el cursor.

modos de operación:

cdargses un poco como vi / vim en este sentido donde tiene esta noción de modos . Hay 2 de ellos, navegación (B) y listado (L). Puede ver en qué modo se encuentra a través de la pantalla en la parte inferior de su shell.

Modo de listado:

L: /home/saml/tst/88038

Modo de navegación:

B: /home/saml/tst/88038

Puede modificar su modo presionando la tecla de tabulación ( TAB).

Esta es solo la punta del iceberg, consulte la página de manual ( man cdargs) y también la ayuda integrada para obtener más información.

Emon
fuente
2

La mejor herramienta para esto es: wcd . He probado muchas otras herramientas, y esta se usa exactamente de la manera que usted pregunta y es mejor en muchos sentidos que todas las soluciones anteriores.

Daniel Fanjul
fuente
1

Las otras respuestas son geniales y específicas. Otra forma de verlo es usar un procesador de macro de teclado que pueda hacer casi cualquier cosa que se te ocurra.

Echa un vistazo a AutoKey. Puede sustituir frases como la autocorrección de un procesador de textos o el historial de bash y también puede ejecutar un script de python en una tecla de acceso rápido que defina, que puede hacer casi cualquier cosa y también enviar pulsaciones de teclas a su dispositivo de entrada de caracteres, como si las hubiera escrito.

El único "inconveniente" que tiene (en relación con esta pregunta) es que necesita una interfaz gráfica de usuario para ejecutar in-gnome o kde. Las otras respuestas no tienen este requisito.

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

Hay otra alternativa llamada z .

Aprende sobre cada cambio de directorio:

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

Luego puede cambiar a ese directorio más tarde con coincidencia difusa:

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

Apparix es otra herramienta que hace esto. Una de sus características útiles es que puede saltar directamente a los subdirectorios de la marca y completar la pestaña en esos subdirectorios.

micanos
fuente
0

Otra solución que, creo, es autojumpy zes fasd.

Realiza un seguimiento de los directorios que visita y z dir-namecambiará al directorio con el nombre dir-nameque usa con más frecuencia. También tiene alguna funcionalidad para archivos de uso frecuente.

Puede clonarlo desde: https://github.com/clvv/fasd

La instalación es sencilla, clone, realice la instalación y luego modifique su .bashrc(o .zshrcetc.).

Jonathan
fuente
0

Debe agregar un alias a su .bashrco .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

Ahora, supongamos que desea un acceso directo ~/Desktop/Coding/Projectspara invocar el que escribirá goto_Projs. Debe agregar la siguiente línea al archivo abierto en el editor de texto:

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

Ahora haga lo que su editor de texto quiera que haga para guardar (en /User/<yourusername>/o ~/por supuesto) y salir, y cuando se devuelva el indicador de comandos de la shell, vaya

source ~/.bash_profile

Su alias ahora debería estar disponible para invocar como se describió anteriormente.

Nathan P. Keene
fuente
0

Utilizo el método de agregar un comentario al final del comando y luego invocar ctrl Rpara invertir la búsqueda del comentario. Esto tiene las siguientes ventajas:

  • buscar un comando en lenguaje natural
  • cambie el comentario en cualquier momento sobre la marcha y obtenga la última actualización de ctrl R
  • use ctrl Ry tabsobre la marcha para hacer pequeños ajustes al comando en sí mismo, lo que hace que el comentario sea una especie de acceso directo genérico a una familia de comandos similares
  • no se requieren configuraciones, instalaciones o mantenimiento de libros :-)
erav
fuente