¿Cómo moverse rápidamente hacia y desde directorios profundamente anidados a través de CLI?

16

Sabemos que usar cd <directory>abrirá el directorio, si existe.

Además, cd ..nos llevará un nivel desde el directorio de trabajo actual.

Pero, cuando tenemos un directorio anidado con una ruta más larga como /home/thina/teams/td/tech/app/release/apks, es agotador ir a la carpeta apksy también es difícil volver a otro nodo, digamos aquí /home/thina/teams.

¿Hay alguna forma de omitir el tipeo de cdy cd ..? Estoy usando Ubuntu 16.04.

gsthina
fuente
¡Sí! ¿Hay alguna forma de omitir el tipeo de cdy cd ..?
gsthina
@GSURENDARTHINA Supongo que sabe que puede guardar al menos unas pocas pulsaciones de teclas retrocediendo varios niveles a la vez, por ejemplo, en su casocd ../../../../..
subrayado_d
2
¿Son los enlaces simbólicos una opción?
Bolsillos
1
También es posible que desee ver la CDPATHvariable en los bashdocumentos.
chepner
En caso de que no se haya dado cuenta: puede hacer "cd <directory>" para cualquier directorio en el directorio de trabajo actual, simplemente no comience con una barra inclinada. Así, por tu ejemplo, si el directorio de trabajo es actualmente "/ home / thina / equipos / td / tecnología / app / release" que acaba de escribir "cd" desde servidores
jcadcell

Respuestas:

30

Hay pushdy popd:

pushd /home/thina/teams/td/tech/app/release/apks
# current directory now /home/thina/teams/td/tech/app/release/apks
popd
# current directory now what it was before pushd command

Prueba help pushdy help popdpara más opciones. No hay manpágina, porque pushdy popdson comandos incorporados bash.

Jos
fuente
55
¿No cd -haría lo mismo?
edwinksl
55
@edwinksl sí, pero pushdy popdpuede recordar más de una trayectoria anterior.
Jos
8
No olvide dirsenumerar su pila de directorios dentro de los comandos pushd/ popd.
Arronical
44
Estos se tratan en la página del manual de bash-órdenes internas (7), ya que son fiesta integrado en los comandos. (O también se pueden encontrar en la página del manual completo para fiesta ) Es la misma información que el help pushdy help popdque usted ha mencionado (así como help dirs) pero pensé que me gustaría mencionar que en el caso en que la gente se preguntaba estos comandos vienen.
MT
2
@Jos que están mal escritashelp pusdh
Sergiy Kolodyazhnyy
16

Además de las muy buenas respuestas ya proporcionadas, aquí hay algunos consejos sobre el uso cdefectivo.

  • cd - lo llevará de regreso al último directorio en el que estuvo.
  • cd ../../..te llevará 3 niveles a la vez, puedes usar la ..notación encadenada para 'subir' tantos directorios como quieras.
  • Si no está seguro de cuántas veces desea subir, use cd .., luego use el historial de bash presionando la tecla de flecha hacia arriba para usar el comando nuevamente.
  • Use ~para reemplazar el directorio de inicio de los usuarios actuales, si ha iniciado sesión como el usuario thina cd ~/teams, lo llevará a/home/thina/teams
  • Uso Bash auto-completado de caminos, la tecla de tabulación completará un tramo de una ruta en el cdcomando, si escribe parte de un segmento de la trayectoria seguida por Tab, ese segmento se completará si no hay otra opción válida. Por ejemplo, si hubiera escrito cd /home/thina/teams/td/tentonces presionado Tab, la palabra tecnología se rellenará automáticamente, siempre y cuando no había otros archivos o directorios en el directorio td que se inició con la letra t.

El uso de estos consejos juntos pueden hacer directorios de desplazamiento con cdmucho menos doloroso.

Arronico
fuente
2
Agregar al punto en adelante ~, particularmente si es root, lo ~userllevará rápidamente al userdirectorio de inicio de.
un CVn
Gracias, no me daba cuenta de que, voy a añadir en la próxima edición.
Arronical
9

Para subir en el árbol varios niveles a la vez, puede usar la siguiente función (gracias a muru por la versión mejorada):

up ()
{
    local old="$PWD"
    for i in $(seq "${1:-1}"); do
        cd ..
    done
    OLDPWD="$old"
}

Entonces puedes hacer:

$ pwd
/home/thina/teams/td/tech/app/release/apks
$ up 5
cd'ing into /home/thina/teams

Adicionalmente:

  • llamando upsin un argumento es equivalente a cd .., debido a ${1:-1}la cual sustitutos $1cuando set y 1lo contrario
  • establecer OLDPWD después de la última cd ..tiene como objetivo preservar el habitual cd -comportamiento.
Parras
fuente
1
Técnicamente, se trata de una función, no un alias.
Reinier Mensaje
@ReinierPost: ¡Muy bien! Lo he corregido en consecuencia.
Parras
2
Sugerencias: en -gtlugar de >. >es lexicográfico, se compara como cadenas. Además, en lugar de construir un camino, por qué no hacerlo cd ..en un bucle: for i in $(seq "${1:-1}"); cd ..; done? Eso también puede eliminar la ifcondición.
Muru
@muru Estoy de acuerdo con su gtcomentario, pero con respecto a su segunda sugerencia, vea la viñeta final en la respuesta. Tiene sentido para mi.
Olifante - Restablecer Mónica
1
@Oliphaunt que no es particularmente difícil, solo configura OLDPWDla ruta original. Aquí hay una versión completa: paste.ubuntu.com/17990874
muru
7

Para nombres de directorio largos, use variables con ruta completa. Por ejemplo,

APKS="/home/thina/teams/td/tech/app/release/apks"

Entonces puedes hacer solo cd "$APKS"

En cuanto a subir x número de directorios, tengo esta función definida en mi .bashrc

goup() # go up x number of dirs
{
  num=$1
  while [ $num -ne 0  ];do
    cd ..
    num=$( expr $num - 1   )
  done
}

Volver a /home/thina/teamsde apksti haría

goup  6

Aquí hay un ejemplo de uso:

$> pwd
/sys/class/backlight/intel_backlight
$> goup 3
$> pwd
/sys
$> 

Otra pequeña función que se me ocurrió, pero que nunca usé tanto es la bookmarkfunción.

Así es como funciona: guarda su carpeta actual en algún archivo, y luego puede cd a un directorio específico basado en el número de línea en ese archivo. Ejemplo:

$> cd /etc/lightdm
$> bookmark
$> cat ~/.dirsbookmarks                                                                                                  
/home/xieerqi
/sys/class/backlight
/etc/lightdm
$> cd $( awk 'NR==2' ~/.dirsbookmarks  )                                                                                 
$> pwd
/sys/class/backlight

Y aquí está la función en sí:

bookmark()
{ # bookmarks current dir
  pwd >> $HOME/.dirsbookmarks
}
Sergiy Kolodyazhnyy
fuente
5

ACTUALIZACIÓN: hay una herramienta aún más poderosa que autojump: fasdpero no estoy familiarizado con ella.


Me sorprende que nadie haya mencionado autojumptodavía qué

funciona manteniendo una base de datos de los directorios que más utiliza desde la línea de comandos (los directorios deben ser visitados primero antes de poder acceder a ellos).

Es básicamente lo que ha construido @graipher, con algunas opciones adicionales.

Como ya he mencionado en otra pregunta:

Después de cd varias veces a un directorio (incluso una vez es suficiente):

cd /home/thina/teams/td/tech/app/release/apks

puede usar el acceso directo jpara moverse rápidamente allí, independientemente del directorio en el que se encuentre actualmente:

j apks

Tenga en cuenta que el uso de cualquier parte de la ruta funciona, siempre que sea el más alto de la lista: j apptambién lo llevará .../apkssi fue allí más veces que a otras .../app.

Lo recomendaría en lugar de tener su propio script, ya que está bien mantenido, distribuido para Ubuntu y tiene otras características interesantes, como saltar al niño :

.../td/tech $ jc apk
.../release/apks $ 

Te ha mudado a , apksen tdlugar de otro apksdebajo de un árbol diferente.

Ciprian Tomoiagă
fuente
+1 para 'fasd'. Es realmente útil
Thomas
4

Alias

Tengo una lista de directorios de uso frecuente disponibles directamente a través de alias. Esto también incluye accesos directos para los directorios de la jerarquía.

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias cdwork=/home/knub/Repositories/work
alias cduni=/home/knub/University

Ahora, cuando quiero subir tres niveles, simplemente ....<Enter>escribo y ¡ahí estoy!

knub
fuente
Esto también me gusta, porque aunque al principio pensé "hmm 4 períodos para 3 niveles ..." luego pensé, "¡Oh sí ... Computadoras! ¡ 0 , 1, 2, 3!" : D Ahora es fácil de recordar, útil y algo con lo que jugaré también. ¡Salud!
P Smith
github.com/bac0n/bash_completion con bash_completion
bac0n
4

Active la autocdopción ( shopt -s autocd), para que no tenga que escribir cd. Por ejemplo, solo necesita el comando de dos caracteres ..para ir al directorio principal.

Si está navegando entre dos directorios, puede alternar entre ellos cd -, que va al directorio de trabajo anterior. La autocdopción no se -ejecuta, cd -pero puede definir un alias o función para eso.

Puede memorizar directorios en una pila con los builtins pushdy popd. El incorporado dirsenumera la pila de directorios (me parece dirs -vmás legible).

Si con frecuencia cambia a subdirectorios de un directorio en particular, y estos subdirectorios tienen un nombre bastante único, agréguelos a la CDPATHvariable. Sin embargo, tenga en cuenta que nunca he encontrado una situación en la que CDPATHfuera realmente útil.

Puede establecer una variable en un nombre de directorio y luego cambiarlo con $foo.

Zsh instalar zsh tiene algunas características agradables que bash no tiene. Algunos de ellos se pueden emular escribiendo funciones que hacen el mismo trabajo. En particular, la forma de dos argumentos le cdpermite cambiar convenientemente a otro directorio con un nombre similar, por ejemplo /home/thina/teams/td/tech/app/release/apks/com.acme/v1, desde , la ejecución cd release betava a /home/thina/teams/td/tech/app/beta/apks/com.acme/v1.

Gilles 'SO- deja de ser malvado'
fuente
2

Como ya respondí a una pregunta relacionada en UnixSE, utilizo un script llamado z [github] para esto.

Recuerda los directorios a los que ingresó, los clasifica según su frecuencia (frecuencia + actualidad) y le permite cambiar a una de las rutas recordadas utilizando alguna parte de su nombre.

Después de haber cd'ed a un directorio al menos una vez, puede hacer, por ejemplo, en lugar de:

$ cd ~user/very/long/path/with/many/subfolders/

Solo haz:

$ z sub

lo que funcionará, utilizando una coincidencia parcial de nombres (suponiendo que no tenga otro directorio que contenga en su ruta el término sub y que tenga una frecuencia más alta).

También definí una función como esta, que primero prueba un cd normal y si eso falla usa z:

function cd() {
    builtin cd "$1" 2> /dev/null || z "$1" || (echo "cd: File or Directory not found: $1" >&2 && exit 1)
}

Esto te da lo mejor de ambos. Si la carpeta está en el directorio actual o si se proporciona una ruta completa válida, solo aparecerá en el CD, pero si no, intentará encontrar una coincidencia en la base de datos y allí. Esto elimina el dolor (pequeño) de tener que usar a veces cd (para entrenar la base de datos, ir a una carpeta en la que nunca había estado antes) y a veces recordar usar z, cuando corresponda.

Graipher
fuente
¿Estás seguro de que este cdtuyo no interfiere con la forma en que se zacumula la base de datos de los directorios visitados con frecuencia?
Leftaroundabout
¿Cómo es diferente de autojump?
Ciprian Tomoiagă
@leftaroundabout: No estoy seguro, pero hasta ahora ha funcionado bien. z definitivamente construye la base de datos cada vez que usa el CD incorporado (que mi configuración intenta primero). Sin embargo, no estoy tan seguro de si la base de datos se actualiza cuando se usa la parte z. EDITAR: acabo de probar si la base de datos se actualiza al hacer un $ cd incorporado ~ / carpeta / i / have / not / been / to / yet /. Es.
Graipher
1
@CiprianTomoiaga De hecho, parece hacer básicamente lo mismo. La sobrescritura del comando cd que uso también podría usarse para eso. diferentes comandos de autocompletar parecen interesantes, sin embargo!
Graipher
por cierto: no soy el autor de z, solo lo encuentro muy útil.
Graipher
1

Tres opciones más que encuentro que funcionan bien (aunque en el futuro pueda usar pushdmás, solo acabo de enterarme de eso):

  • Organice sus rutas para que no necesite cden directorios profundamente anidados en primer lugar, o más bien: para que las ubicaciones que necesita visitar a menudo estén al alcance de su mano. La forma de lograr esto es con enlaces simbólicos : mantenga los directorios explícitos y bien jerarquizados tal como están, pero cree un enlace de acceso rápido para su propia conveniencia.

    ln -s ~/teams/td/tech/app/release/apks ~/apks

    Luego, en lugar de escribir el camino largo hacia cd, simplemente use cd ~/apks, y cd ../teams(o, en ese ejemplo preferible ~/teams) , para regresar.

  • No use un solo shell y un CD de ida y vuelta entre las rutas, pero mantenga un shell en ejecución para cada una de las rutas en las que necesita trabajar. Hay varios niveles en los que puede lograr esta multitarea:

    • Use múltiples ventanas de terminal. Funciona mejor si las ventanas viven en diferentes espacios de trabajo .
    • Use múltiples pestañas en una sola ventana. Esto es particularmente adecuado para solo hacer unos pocos comandos en algún directorio: para volver, simplemente cierre la pestaña del terminal.
    • (No es realmente una IMO sensata, pero para completar :) use un multiplexor de terminal como tmux.
    • Simplemente inicie una acción en un comando de propósito único que se encuentra cden la carpeta, hace una cosa allí e inmediatamente devuelve el control de la carpeta original: en lugar de

      $ cd /home/thina/teams/td/tech/app/release/apks
      $ some_command this_file_here
      $ cd ../../../../..

      simplemente haz el one-liner

      $ (cd ~/teams/td/tech/app/release/apks; some_command this_file_here)

      o equivalente

      $ sh -c 'cd ~/teams/td/tech/app/release/apks
      > some_command this_file_here'
  • No cd en absoluto , sino simplemente ejecutar el comando derecha desde su directorio principal. Las expansiones de llaves pueden ayudar mucho aquí: en lugar de

    $ cd /home/thina/teams/td/tech/app/release/apks
    $ some_command this_file_here other_file_also_apks
    $ cd ../../../../..

    tu puedes hacer

    $ some_command ~/teams/td/tech/app/release/apks/{this_file_here,other_file_also_apks}
leftaroundabout
fuente
pushdEs muy muy útil. Es posible que desee agregar más información sobre cómo usarlo para mejorar su respuesta.
Sergiy Kolodyazhnyy
@Serg: sí, pero yo mismo sé empujado solo por la respuesta de Jos arriba .
Leftaroundabout
Ah, ya lo veo. Bueno, entonces podría ser útil para futuras respuestas.
Sergiy Kolodyazhnyy
1

Pushd y Popd

Los comandos pushdy popdson mis favoritos. El pushdcomando recordará los directorios que ha visitado, visibles con el comando dirs, y cuando esté listo para saltar hacia atrás, use popdpara regresar.

Aquí hay un ejemplo usando las funciones de bash y los alias:

sd ()
{
    pushd "$1" > /dev/null
}

po ()
{
    popd
}

alias d='dirs'

Constantemente uso una combinación de estos comandos de varias maneras.

Alias

Otra opción para los directorios a los que se accede con frecuencia es simplemente alias de los comandos cdo pushd. Entonces, usando los ejemplos de tu publicación:

alias cdapks='cd /home/thina/teams/td/tech/app/release/apks'
alias cdteams='cd /home/thina/teams'

Combinación

Combina las dos ideas e incluso puedes tener esto:

alias sdapks='sd /home/thina/teams/td/tech/app/release/apks'
alias sdteams='sd /home/thina/teams'

Lo que le da mucha flexibilidad para atravesar directorios. Guardo las cd***y sd***los alias en la mano para cosas como Desktop, Documents, Music, Downloads, etc y es muy práctico!

tniles
fuente
1

Prueba z.lua : un nuevo comando de CD que te ayuda a navegar más rápido aprendiendo tus hábitos.

  • cd a un directorio contiene foo:

    z foo
  • cd a un directorio termina con foo:

    z foo$
  • usa múltiples argumentos:

    Asumiendo la siguiente base de datos:

    10   /home/user/work/inbox
    30   /home/user/mail/inbox

    "z in"sería cd en /home/user/mail/inboxla entrada de mayor peso. Sin embargo, puede pasar múltiples argumentos a z.lua para preferir una entrada diferente. En el ejemplo anterior, "z w in"cambiaría el directorio a /home/user/work/inbox.

  • cd con selección interactiva:

    Cuando se encuentran varias coincidencias, el uso z -imostrará una lista:

    $ z -i soft
    3:  0.25        /home/data/software
    2:  3.75        /home/skywind/tmp/comma/software
    1:  21          /home/skywind/software
    > {CURSOR}

    Luego puede ingresar el número y elegir a dónde ir antes del cd real. p.ej. entrada 3 a cd a /home/data/software. Y si solo presiona ENTER y no ingresa nada, simplemente se cerrará y permanecerá donde estaba.

    z.luaTambién admite la fzfselección interactiva o la finalización de argumentos:

    terminación con fzf

  • rápido volver al padre sin escribir cd ../../..:

    La nueva opción "-b"puede volver rápidamente a un directorio padre específico en bash en lugar de escribir "cd ../../ .." de forma redundante:

    • (Sin argumento) : cden la raíz del proyecto, la raíz del proyecto es el directorio principal más cercano con .git/ .hg/ .svnen él.

    • (Un argumento) : cden el padre más cercano que comienza con la palabra clave, si no encuentra, vaya al padre que contiene la palabra clave.

    • (Dos argumentos) : reemplace el primer valor con el segundo (en la ruta actual).

    ...

    Comencemos alias z -ba zb:

    # go all the way up to the project root (in this case, the one that has .git in it)
    ~/github/lorem/src/public$ zb
      => cd ~/github/lorem
    
    # cd into to the first parent directory named g*
    ~/github/vimium/src/public$ zb g
      => cd ~/github
    
    # substitute jekyll with ghost
    ~/github/jekyll/test$ zb jekyll ghost
      => cd ~/github/ghost/test

Desearía que se ajuste a tu necesidad.

skywind3000
fuente
0

El pescado tiene varias instalaciones agradables para moverse rápidamente.

  • Si escribe cd con la flecha hacia la derecha, se repite el cd más reciente.
  • Al usar cd flecha arriba flecha derecha enter, repite el segundo cd más reciente.
  • Etc.
  • Tiene prevd y nextd, que a menudo son más fáciles de usar que pushd y popd.

Además, mantengo mis directorios favoritos enlazados a ~ / f, por lo que puedo cd ~ / f / x para llegar a ~ / foo / bar / baz / experimental-data.

Theodore Norvell
fuente
0

Durante mucho tiempo he usado alias para directorios de acceso frecuente.

También tengo una función bash llamada ccb (abreviatura de crear archivo bat de CD - esto se originó en dos / windows donde el script de shell .bat ccb.bat crearía otro archivo .bat para saltar al directorio actual) que crea / agrega alias (en el archivo .bash_aliases) al directorio actual.

por ejemplo: $ ccb myfav creará un alias en el directorio actual con un alias myfav en el archivo .bash_aliases y generará el archivo .bashrc para que el alias esté disponible de inmediato.

Acabo de encontrar una nueva solución. Es una función bash

## USAGE : lj <your_dir>
### lj -- short for LongJump -- (kinda similar to a C function which would jump to an address outside of your current function)
function lj() {
        pushd `find . -type d -name $1 -print | head -n 1`
}

$ lj deeply_nested_dir_name

Esto no necesita aprender nada del uso anterior. El problema que esto podría no resolver es: si hay más de 1 directorios llamados "deep_nested_dir_name" en el árbol del subdirectorio, entonces saltará al primero del directorio encontrado por find.

Además, esta solución no podrá pasar a otro árbol de directorios.

entre los alias codificados y los alias generados y esta nueva función lj (), la mayoría de mis necesidades están cubiertas.

Aquí está mi función bash ccb () para cualquiera que quiera usarla

function ccb() {
        foo=$PWD
        echo "" >> ~/.bash_aliases
        echo "alias $1='pushd $foo > /dev/null'" >> ~/.bash_aliases
        source ~/.bashrc
}
anjanb
fuente