¿Cómo puedo cambiar al directorio anterior en lugar de subir?

214

Actualmente paso muchas de mis horas de trabajo moviéndome de un lado a otro entre dos caminos que están muy lejos en el árbol y se desvían unos de otros en la raíz. Me parece que mi vida sería mucho más fácil si hubiera un argumento cdque lleve al usuario al último directorio en el que se encontraba.

Es decir, si estoy en:

/etc/foo/bar/baz/moo

y luego escribe:

cd /var/lib/fubarred_app/blargh/logs

Me gustaría poder volver al primer directorio sin tener que volver a escribir la ruta completa.

La clave de memoria no la corta, ya que uso suficientes comandos en cada lugar para que sea tan difícil regresar y encontrar el camino que quiero como escribirlo yo mismo.

¿Hay un comando breve que me permita ir al directorio anterior?

Itzjak
fuente
8
Además de la excelente respuesta de @ bryan , puede considerar crear un par de alias para cada ruta para que pueda escribir algo como: " bazmoo" o " blarghlog" en el indicador :)
warren
44
¿Por qué no usas la pantalla GNU ?
Shi
2
Cual caparazón? Eso hace una gran diferencia.
Randal Schwartz
@warren ídem. esa es mi forma preferida de hacer todo. la mitad de lo que yo uso en mi equipo tiene su propio alias ahora ... =)
ixtmixilix
Fasd es asombroso. Echale un vistazo.
majkinetor

Respuestas:

301

El comando

cd -

realizará el intercambio que necesita en la mayoría de los shells convencionales, la variante más larga más antigua es

cd "$OLDPWD"

que usará la variable de entorno que contiene el directorio de trabajo anterior.


La página de manual POSIX paracd menciones:

DESCRIPCIÓN

Si, durante la ejecución de los pasos anteriores, se modifica la variable de entorno PWD, la variable de entorno OLDPWD también se cambiará al valor del antiguo directorio de trabajo (que es el directorio de trabajo actual inmediatamente antes de la llamada a cd).

Operandos

  -   Cuando se usa un guión como operando, será equivalente al comando:

cd "$OLDPWD" && pwd 

que cambia al directorio de trabajo anterior y luego escribe su nombre.

Bryan
fuente
77
Tenga en cuenta que esto realmente depende del shell que esté utilizando, y dado que no especificó, sería difícil dar la respuesta "portátil" inexistente.
Randal Schwartz
16
@Randall, tal vez puedas combinar todos tus comentarios de shell individuales en una respuesta de Voltron-Shell.
Hiperslug
@Randall. Estaba usando bash. Funciona en ksh y zsh también. Por cierto, aprendí a programar desde la edición de 1994 de Learning Perl, así que discúlpeme mientras fanboy un poco. :)
Yitzchak
Hmm, solía hacer cd $OLDPWDesto. Es bueno que los shells convencionales ofrezcan una forma mucho más corta.
ulidtko
2
Ciertos sabores @sinni hacer tener pushd, y al menos es una orden interna en bash.
slhck
105

Además de la respuesta de bryan, vale la pena mencionar que también hay pushdy popd, que crean directorios como una pila. Esto también está disponible en Windows NT; sin embargo, no está disponible en todos los shells.

Por ejemplo, podemos ir a tres directorios diferentes, y siempre verá su pila cuando llame pushd:

charon:~ werner$ pushd Documents/
~/Documents ~

charon:Documents werner$ pushd ../Movies/
~/Movies ~/Documents ~

charon:Movies werner$ pushd ../Downloads/
~/Downloads ~/Movies ~/Documents ~

Y cuando llamas popdtres veces seguidas, llegas a esos directorios en la pila en orden inverso. Al mismo tiempo, la pila se vaciará nuevamente.

charon:Downloads werner$ popd
~/Movies ~/Documents ~

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

charon:~ werner$ popd
-bash: popd: directory stack empty

Si está usando Zsh; tiene una opción AUTO_PUSHD, que empujará automáticamente cda la pila.

slhck
fuente
pushd y popd no están disponibles en todos los shells.
Randal Schwartz
55
@ Wiesław: ¿En serio? Me gustaría que tenía fiesta ... Por supuesto, podría alias cda pushd, y sería sobre todo ser el mismo.
Chris Charabaruk
3
O alias pd para pushd y tener ambos. Por cierto, pushd (o pd, si lo alias) intercambia por sí mismo el directorio actual y el último directorio empujado, logrando esencialmente lo que hace 'cd -'.
JRobert
Me gusta el concepto pero nunca me acostumbré a ellos.
Thorbjørn Ravn Andersen
13

Hay algunos programas de "salto"

  • salto automático (mantenido con funciones básicas)
  • j2 (aparentemente sin mantenimiento con algunas características avanzadas)
  • z (versión mantenida de "j" con funciones avanzadas)

Estos facilitan cualquier tipo de navegación del directorio. Lo usas dando una parte de la ruta y simplemente funciona.

En tu caso

~$ j baz 
/etc/foo/bar/baz/moo$

~$ j bla 
/var/lib/fubarred_app/blargh/logs$

Puede asignar cualquier letra que desee a estos programas, "j" es tradición :)

j2 y z admiten múltiples términos de búsqueda, ...

~$ j baz src
/home/me/projects/baz/repository/trunk/src$

... y más opciones.

~$ j -l  # list directories by "frecency"(frequency + recency) score
~$ j -r PATTERN # match by rank only, not recency
~$ j -t PATTERN # match by recency only, not rank
hayalci
fuente
2
"j" es claramente específica de la concha. No dijiste eso.
Randal Schwartz
3
@Randal: ¿Cómo es específico de shell? Es un programa.
Fixee
3
Soy un idiota. :) Ya lo veo.
Randal Schwartz
10

Además de cd -ycd $OLDPWD

Puede usar la búsqueda de historial presionando CTRL-Ry escribiendo algunas letras del cdcomando que ingresó anteriormente. Presionar CTRL-Rrepetidamente traerá partidos más antiguos.

Este método será más útil si tiene más de dos rutas para cambiar.

musa
fuente
1
CTRL-R no necesariamente ayudará. Es posible que haya estado en / some / obscure / directory / deep y haya hecho "cd evendeeperdir" y luego haya ido a ~ / somehere / different.
justintime
1
¡Excelente! Funciona para otras cosas además de cd, ¡gran ayuda!
Niloct
9

Puede usar esto para crear fácilmente alias para directorios:

a() { alias $1=cd\ $PWD; }

a 1

y después:

1
Señor ejemplo
fuente
1
Solo en un shell que comprende alias y funciones. No todos lo hacen.
Randal Schwartz
así que esto omite escribir las alias =partes? hmmmm
Xen2050
6

bashmarks le permitirá marcar una serie de carpetas y saltar entre ellas con la finalización de la pestaña:

Para marcar una carpeta, simplemente vaya a esa carpeta, luego márquela así:

bookmark foo

El marcador se llamará "foo". Cuando desee volver a esa carpeta, use:

go foo

Para ver una lista de los marcadores:

bookmarksshow

La finalización de la pestaña funciona, para ir al marcador shoobie, simplemente:

go sho[tab]
Manitas5
fuente
4

Otra posibilidad sería mantener dos ventanas abiertas, con una posicionada en cada directorio.

Argel
fuente
Sin embargo, no hay historial compartido, si usa / edita comandos anteriores con regularidad (¿tal vez un restablecimiento los obtendría ...?)
Xen2050
@ Xen2050 Consulte la opción de shell share_historyen zsh.
Radon Rosborough
4

Sé que esto no es estrictamente una respuesta a su pregunta, pero es útil para alcanzar el objetivo de llevarlo a sus directorios importantes .

en cualquier descenso UNIX-bash puede usar CDPATH para extender la carpeta en la que busca el comando cd.

de mi archivo .bashrc:

export CDPATH='.:~/source/'

cd primero busca en su carpeta actual, luego busca en mi coding-project-directory.

cd myproject

.. me lleva a ~ / sources / myproject desde donde estoy actualmente parado.

Pequeña característica simple que ha ayudado mucho a mi navegación de directorio.

phareim
fuente
1
+1 Esto agrega la carpeta CDPATH a cdla lista de autocompletado (TAB), que es buena. Pero si .no está incluido y si hay una carpeta en una carpeta CDPATH con el mismo nombre que una en su directorio actual, cd samenameirá al directorio CDPATH y no a la del directorio actual, lo cual es malo. Tiene que usar cd ./samenamepara entrar en una carpeta dup.
Xen2050
Si, buen comentario. Incluya siempre el primero . o experimentarás cosas raras.
phareim
3

Sí, cd -es el camino a seguir, pero me preocupa la falta de poder que tienes en tu caparazón. popdy pushdtambién son buenos, y esa jcosa también se ve bien.

Lanzaré mi propia utilidad al ring ... es algo que he estado construyendo, personalizando y migrando conmigo durante los últimos 10 años más o menos y funciona bien para lo que quiero que haga.

Publicación de blog para mi utilidad de administración de directorios

Si funciona para ti, entonces increíble, pero si no lo hace, prométeme que obtendrás algo más :) Simplemente no puedes vivir cdsolo.

Derek Wyatt
fuente
3

Si solo tiene 2 directorios, la forma más fácil es, como se mencionó,

cd -

Cuando tuve tales cosas en el pasado, tuve algunos trucos que hice, que podrían ser útiles.

  1. Ponga comandos de alias en el archivo .cshrc, algo como esto

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. Vincular accesos directos a las rutas de interés desde mi directorio de inicio. Esto es una cosa de una vez.

    cd ~
    ln -s /var/lib/fubarred_app/blargh/logs blargh
    ln -s /etc/foo/bar/baz/moo
    

Esto permitiría cambiar un directorio tan fácil como:

   cd ~/moo
   cd ~/blargh
PearsonArtPhoto
fuente
2

Autojump es un comando "cd" bash / sh / zsh que de tus acciones, mira este video .

así que esto te movería a muu después de que haya aprendido las últimas carpetas

j moo
oluies
fuente
2

haz

Tengo mi propia herramienta, pero también echaré un vistazo a la herramienta de Dereks j.

Por supuesto, la primera opción para saltar de un lado a otro es

discos compactos -

Mi herramienta está destinada a directorios con nombres únicos en sistemas, donde locateestá disponible; busca un nombre de directorio coincidente y salta a la primera coincidencia:

beam () 
{ 
    ldir=$(locate $1 | egrep "$1$" | head -n 1);
    if [[ -d $ldir ]]; then
        echo $ldir;
        cd $ldir;
    else
        echo "no directory "$ldir;
    fi
}

Dependencias:

  • localizar
  • grep
  • cabeza

Inconvenientes:

  • no se encuentran directorios más nuevos que la última actualización-ejecución
  • si coincide más de un directorio, depende de su suerte, ya sea que se transmita al que tenía en mente.

Mejoras / modificaciones:

  • en lugar de elegir el primer directorio, el código puede modificarse para mostrar una lista de opciones, solicitando al usuario que ingrese 1,2,3, ... para ir a / bin, / usr / bin, / usr / local / bin ...

Uso:

  • ponga la función en usted /etc/bash.bashrc o ~ / .bashprofile, para usarla de manera conveniente.

Ventaja de mi solución:

  • no limitado a 2 directorios, como cd -
  • no tiene que visitar los directorios una vez, antes de usar la viga.
usuario desconocido
fuente