Usando cd para subir múltiples niveles de directorio


31

Estoy tratando con proyectos java que a menudo resultan en carpetas profundamente anidadas (/ path / to / project / com / java / lang / lo que sea, etc.) y algunas veces quiero poder saltar, digamos, 4 niveles de directorio hacia arriba. Escribir cd ../../../ .. es un dolor, y no quiero un enlace simbólico. ¿Hay algún indicador en cd que te permita subir varios niveles de directorio (en mi opinión, sería algo como cd -u 4)? Desafortunadamente, no puedo encontrar ninguna página de manual para CD específicamente, en lugar de obtener la inútil página "incorporada".


1
Modificando bash para interpretar cd ... donde el número de '.' Sería el número de niveles para subir. ¿Esto causaría un conflicto del cual no estoy enterado?

Respuestas:


25

O ... prueba esto: (yay Google)

Navegue hacia arriba en el directorio usando ... n:

En el siguiente ejemplo, ..4 se usa para subir 4 niveles de directorio, ..3 para   sube 3 niveles de directorio, ..2 para subir 2 niveles de directorio.

Agregue el siguiente alias al perfil de .bash y vuelva a iniciar sesión.

alias .. = "cd .."

alias ..2 = "cd ../ .."

alias ..3 = "cd ../../ .."

(etc)

Ver Hack # 2


10
Prefiero usar los alias .., ... y .... ya que son más rápidos de escribir, pero el principio de alias es el mismo, por supuesto.
Bernhard

1
@bernhard Eres más que bienvenido, ya que no creo que cause ningún conflicto. Lo dejé como está porque lo cité en el sitio web.
cutrightjm

El shell 4DOS.EXE para DOS también es compatible cd ..., cd .... Fue muy útil.
Alexios

22

Una función simple, con un alias, también:

function cd_up() {
  cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'

(Podrías definir esto en ~/.bashrc Si lo quieres en cada caso).

Es fácil de usar:

$ cd.. 10

¡Buena esa! ¡Funciona para mi! Bash 4.3.11
Carlos Nunez

1
Buena respuesta; Es posible que desee señalar que esto es mejor que las soluciones como eval $(printf "cd ..;%.s" $(seq $1)) cual cd varias veces, porque ~- alias $OLDPWD se establece en el directorio de trabajo desde antes de la invocación, en lugar de a un directorio intermedio. PD - se simplifica a cd $(printf %.s../ $(seq "$1")) si tu quieres.
Toby Speight

9

Una solución simple y de baja tecnología que no necesita ninguna configuración. Solo funciona en conchas con bash Edición de comandos de estilo, sin embargo.

  • Tipo cd ..
  • prensa Flecha arriba Regreso tantas veces como sea necesario Muy rápido si usas dos dedos.

2
jaja, no es una mala respuesta, supongo :)
joshmcode

8

Resulta que la respuesta correcta es 'cd + n', donde n es el número de niveles que desea subir. Lástima que esto no está documentado en ninguna parte!


14
al menos NO funciona en bash.
HongboZhu

5
No funciona en bash 4.2.25 como se incluye con Debian. Por curiosidad, ¿qué * nix y / o shell estás usando?
Alexios

Bash tiene un incorporado llamado dirs que toma [+ n] como argumento, e imprime el enésimo directorio único que se agregó a través de pushd. Si tu alias cd a pushd, entonces puedes usar esto. Sin embargo, tenga en cuenta que esto no es técnicamente una respuesta a la pregunta del OP, porque tiene que ver con único directorios, lo que significa que el orden se confunde con el tiempo, al regresar a los mismos directorios.
Brian Peterson

Sí, pushd y popd También tome una opción [+ n], por lo que es capaz de trabajar. Además, aunque es imperfecto e indirecto, supongo que esto puede usarse como respuesta a la pregunta. A menudo, visitó los directorios anteriores que recientemente, por lo que estarán en los últimos 10 directorios almacenados por la pila de directorios.
Brian Peterson

no funcionó para mí ...
Vass

3

Podría escribir una función (tiene que ser una función, ya que desea cambiar el estado de su propia shell, es decir, el directorio de trabajo; un comando externo solo afectaría su propio proceso).

Aquí hay una función que subirá varios niveles pasados ​​como argumento (por defecto 1) en el físico estructura de directorios (asi, como cd -P .., norte veces):

up() {
    # default parameter to 1 if non provided
    declare -i d=${@:-1}
    # ensure given parameter is non-negative. Print error and return if it is
    (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1;
     # remove last d directories from pwd, append "/" in case result is empty
    cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/";
}

Úsalo así:

up 4

1
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
Donald Duck

1
De acuerdo, he añadido algunos comentarios para ayudar.
mgild

Para ser nitpicky, no es up 4 realmente equivalente a cd /some/dir/ asumiendo $PWD = "/some/dir/that/is/deeply/nested/"?
snapfractalpop

2

No es exactamente lo que estás pidiendo, pero debes mirar pushd y popd. Los encuentro mucho más útiles para la navegación de carpetas que algunos cd... alias

Si va y viene de un par de áreas fijas, lo normal es tener alias.

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'

1

En lugar de usar alias, también podría usar la siguiente función bash:

function mcd() {
  up=""

  for ((i=1; i<=$1;i++)); do
    up="${up}../"
  done

  cd $up
}

(o como una sola línea: function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; } )

Agregando esto a tu ~/.bashrc El archivo estará disponible en su terminal y en la construcción de un String. ../../../../../../ antes de llamar cd También hará posible su uso. cd - para volver al directorio de inicio.

Una implementación más útil también podría contener algunas comprobaciones de entrada de usuario:

function mcd() {
    if [[ $1 -lt 1 ]]; then
        echo "Only positive integer values larger than 1 are allowed!" >&2
        echo -e "\n\tUsage:\n\t======\n\n\t\t# to go up 10 levels in your directory\n\t\tmcd 10\n\n\t\t# to go up just 2 levels\n\t\tmcd 2\n" >&2
        return 1;
    fi  

    up=""

    for ((i=1; i<=$1;i++)); do
        up="${up}../"
    done

    cd $up
}


0

Prueba el parámetro de entorno raramente usado CDPATH. Entonces puede que no tengas que establecer explícitamente el nivel.

Ejemplo:

$ find workspace -type d
workspace
workspace/project1
workspace/project1/com
workspace/project1/com/java
workspace/project1/com/java/lang

$ CDPATH=".:~/workspace:~/workspace/project1:~/workspace/project1/com:~/workspace/project1/com/java:~/workspace/project1/com/java/lang"
$ cd com
$ pwd
~/workspace/project1/com

Si está trabajando en varios proyectos, puede hacer la configuración de CDPATH en un archivo de entorno específico del proyecto. Y dispáralo con una cuña para automatización adicional.

Tiendo a usar pushd y popd bastante. Tiendo a usar CDPATH para dejarme saltar entre los árboles del proyecto en lugar de los subdirecciones en un proyecto, pero en este momento estoy trabajando en muchos proyectos pequeños, no en algunos proyectos grandes. :)


0

Si está anteriormente en el directorio de destino:

luna:/tmp % mkdir -p a/b/c/d
luna:/tmp % pwd
/tmp
luna:/tmp % cd a/b/c/d
luna:d % pwd
/tmp/a/b/c/d
luna:d % cd -
luna:/tmp % pwd
/tmp
luna:/tmp % 

0

Echa un vistazo a DirB . Es un script BASH que te permite crear marcadores de la siguiente manera:

Las operaciones

  • s Guardar un marcador de directorio
  • g ir a un marcador o directorio con nombre
  • p empujar un marcador / directorio en la pila de directorios
  • r eliminar marcador guardado
  • d mostrar la ruta del directorio marcada
  • sl imprimir la lista de marcadores del directorio

Muy simple, muy eficaz.


0

Paso más allá de la respuesta de @Grigory:

function cd_up() {
if [ -z "$1" ]; then
    cd ..
else
    cd $(printf "%0.s../" $(seq 1 $1 ))
fi
}
alias 'cdd'='cd_up'

Es decir :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.