¿Hay un comando para retroceder varios pasos en un directorio, sin usar cd?

14

Constantemente voy a "cd ../../../../". ¿Hay un comando / alias que podría dejarme ir 'cmd 4' y me devolverían 4 directorios?

studiohack
fuente
ls? ¿Seguramente quieres decir cd?
Chris Jester-Young
Sí, lo escribí con prisa;) Editándolo ahora.
¿Hará esto ?:alias cmd5 = "cd ../../../../../"
ypercubeᵀᴹ
Bueno, supongo que podría escribirlos del 1 al 10 más o menos, pero sería bueno tener una forma inteligente de hacerlo. Eso realmente no me sienta bien. Sin embargo, lo hará si no surge otra solución.

Respuestas:

16

Pon esto en tu ~/.bashrc:

cdup() {
  levels=${1-1}
  while ((levels--)); do
    cd ..
  done
}

(El nombre cdupproviene del comando FTP correspondiente, solo para su información).

Chris Jester-Young
fuente
Gracias por la respuesta, fui con la respuesta de jleedev debido a que es 1 línea más corta y no pude decidir quién elegir. ¡Gracias de cualquier manera!
@Muu: Ambas respuestas funcionarán, pero la mía funcionará para muchos, muchos niveles, y @ jleedev solo funcionará para un pequeño puñado (cualquiera que sea el límite de la pila). ;-) (Estoy seguro de que nunca alcanzarás el límite de ninguna manera, pero el mío es más general, es a lo que estoy tratando de llegar. :-))
Chris Jester-Young
Punto justo, te he otorgado la respuesta entonces. Lo siento jleedev, aunque lo más probable es que continúe usando tu solución, ya que olvidaré cambiarla :)
11

Me enseñaron a usar 'pushd' y 'popd' para tales circunstancias.

Por ejemplo, escriba 'pushd'. y luego 'cd / home'. Ahora escriba 'popd' y volverá a donde comenzó.

'pushd' / 'popd' es una pila, puede insertar tantos directorios allí como desee, pero está en último lugar, primero cuando aparece popd.

ʍǝɥʇɐɯ
fuente
Hm, bien No he oído hablar de eso. No se ajusta a lo que estaba buscando, pero también lo usaré. Gracias.
10

Seguro Por qué no:

arriba() {
    [$ # = 0] && cd .. && return
    [$ 1 = 0] && retorno
    cd .. && up $ (($ 1 - 1))
}
Josh Lee
fuente
Bash no es recursivo de la cola, ¿verdad? Puede acumular desbordamiento si lo hace up 500. :-)
Chris Jester-Young
66
Si sus directorios están tan anidados, tiene mis condolencias.
Josh Lee
Usé esto. Batir a Chris por 1 línea;)
@ Muu: ¡No sabía que esta pregunta era un código de golf! ;-) Por cierto, ¡únete a nosotros! codegolf.stackexchange.com
Chris Jester-Young
3
@ Muu Recuerde que la recursividad no es la forma correcta de escribir scripts de shell en general.
Josh Lee
4

Rápido y sucio:

cmd () { dir=.; for i in $(seq 1 $1); do dir=$dir/..; done; pushd $dir; }

Formulado para cambiar solo el directorio una vez.

Glenn Jackman
fuente
2

Aquí hay una forma alternativa:

function cdup
{
    cd $(for ((i=0 ; i<$1 ;i++)); do printf "../" ; done)
}
jlliagre
fuente
1

Es posible que desee considerar el uso pushdy la popdconfiguración de marcadores de ubicación y volver allí fácilmente desde cualquier directorio al que haya cambiado.

También puede establecer una variable con el nombre de un directorio que usa mucho, luego CD allí:

MYPROJ=~/projects/name/src
cd $MYPROJ
proj1='cd $MYPROJ'
Caleb
fuente
1

Yo uso autojump que me permite escribir:

j h
>> /home/cjulien
j et
>> /etc

puede aprender de tus hábitos y es muy ligero (y adictivo;))

Cédric Julien
fuente
1

Construye el camino usando printfentonces cd:

cdup() {
    local path
    printf -v path '%*s' "${1:-1}"
    cd "${path// /../}"
}

Usar como:

cdup 4 # to go up four directories
cdup 1 # to explicitly go up one directory
cdup   # to implicitly go up one
obispo
fuente
0

Dos pensamientos que pueden serle útiles:

  1. cd:
    cambia de nuevo al último directorio en el que estabas. Lo uso todo el tiempo para ir desde lo más profundo de mi árbol de códigos a la raíz ... aunque eso solo funciona si lo hiciste en uno cambio.

  2. cdd old new
    esta era una función de script que había escrito en el pasado y que usaba para moverme entre árboles similares. Básicamente, tomó dos argumentos e hizo una expresión regular en su camino, ideal para moverse entre ramas y tal. Por ejemplo, si estuvieras en ~ / bzr / web / trunk / path / to / feature y necesitaras acceder a ~ / bzr / web / feature-branch / path / to / feature, entonces lo harías cdd trunk feature-branch. La implementación que tuve fue en un lenguaje arcaico de shell en AIX, pero fue bastante trivial, por lo que debería ser fácil de implementar en el shell de elección si lo necesita. Para nosotros fue muy útil porque la estructura se veía así: ... / {product} / {version} / {release} / {src, bld, dbg, pkg, tst} / {component} / ... así que moviéndose en ese árbol se volvió loco bastante rápido.

cabbey
fuente