cambiar directorio (cd) pero reemplazando solo una parte de la ruta


14

No estoy seguro de si es posible, pero parece que recuerdo de mis viejos tiempos usando AIX que era posible cambiar mi ruta simplemente diciendo qué parte de la ruta necesitaba ser reemplazada por otra. Por ejemplo, digamos que tengo dos caminos:

/etc/application-2.0.1/options/default

y

/etc/application-1.0.8/options/default

que podría cambiar de la carpeta 1 a la 2 usando un comando como

cd /2.0.1/1.0.8/

que reemplazaría, en el camino, la cadena 2.0.1a 1.0.8. Obviamente esto no funciona para mí ahora. Pero, ¿hay alguna manera de hacer esto?

Respuestas:


11

Si usa zsh como shell, simplemente puede ingresar cd 1.0.8 2.0.1.


Esta me parece la mejor opción. Ahora buscando cómo instalar esa cosa :)
nathanvda

1
sudo apt-get install zsh
koushik

1
La respuesta de RandomMonkey permite la funcionalidad de sustitución de ruta completa dentro del "cd" incorporado de Bash.
kmarsh

9

Esto debería funcionar en bash en Ubuntu 10.04: cd ${PWD/old/new}. Básicamente, esto reemplaza la primera aparición de olden su directorio de trabajo actual connew . 2 ejemplos a continuación.

Ejemplo 1

ing02741@hoster:~$ cd /home/ing02741/Videos/
ing02741@hoster:~/Videos$ cd ${PWD/ing02741/koushik}
ing02741@hoster:/home/koushik/Videos$ 

Ejemplo 2

ing02741@hoster:~/src/cdtest$ mkdir dir-v1.0.1 dir-v2.2.2 dir-v3.0.7
ing02741@hoster:~/src/cdtest$ mkdir dir-v1.0.1/ind dir-v2.2.2/ind dir-v3.0.7/ind
ing02741@hoster:~/src/cdtest$ cd dir-v1.0.1/ind/
ing02741@hoster:~/src/cdtest/dir-v1.0.1/ind$ cd ${PWD/1.0.1/2.2.2}
ing02741@hoster:~/src/cdtest/dir-v2.2.2/ind$ 

Tomando prestada la idea de sepp2k anterior, podría hacer una función como esta

function mycd { cd ${PWD/$1/$2} }

y luego usa algo como mycd 2.0.1 1.0.8cambiar.


1
Esto es 1/2 camino allí. Si observa la respuesta de RandomMonkey, verá que la funcionalidad completa es posible dentro del Bash Cd incorporado.
kmarsh

8

He usado (y he perdido) esta característica yo mismo. Depende de qué sabor y / o liberación de * nix esté usando. Si usa bash, aquí hay una forma práctica de extender el CD incorporado para incluir esta funcionalidad. Ponga esto en su .bashrc (o para probar pegarlo en su shell de bash y presionar enter).

function cd() { if [ $# -eq 2 ]; then builtin cd ${PWD/$1/$2}; else builtin cd $1; fi }

7

Probablemente estés recordando la expansión de la historia. No sé qué estaba disponible en su shell en AIX, pero una forma de hacerlo en bash es ^2.0.1^1.0.8.

La expansión del historial es menos útil con shells como bash y zsh que tienen una poderosa edición de línea de comandos. Puede usar las teclas de flecha para recuperar comandos anteriores y Alt+ .para insertar la última palabra del comando anterior (presiónelo dos veces para llegar al comando anterior y así sucesivamente).


Solo tiene que presionar enter la segunda vez si la histverifyopción de shoptestá activada.
Pausado hasta nuevo aviso.

@ Dennis: gracias, lo había olvidado --norcal probar.
Gilles 'SO- deja de ser malvado'

3

Si eres un fanático de vi, puedes habilitar el modo vi en tu shell (bash set -o vi por ejemplo) y usar el modo de comando de vi ...

O podría hacer una expansión loca de la historia (probada en zsh, quizás también en bash):

$ cd /etc/application-1.0.8/options/default
cd: no such file or directory: /etc/application-1.0.8/options/default

$ !!:s/1.0.8/2.0.1/
cd /etc/application-2.0.1/options/default
cd: no such file or directory: /etc/application-2.0.1/options/default

Por cierto, lo probé en bash y funciona allí también.
maxschlepzig

3
cd `pwd | sed 's/2\.0\.1/1\.0\.8/'`

Sin embargo, esto no es muy bonito. Puedes mejorarlo un poco, poniéndolo en una función:

function mycd { cd `pwd | sed s$1` }

Y luego llamándolo así:

mycd '/2\.0\.1/1.0.8/'

Sin embargo, aún necesita escapar de los puntos, pero estoy seguro de que esto también se puede solucionar con un poco de reflexión.


Ciertamente no necesita escapar de los puntos en el lado derecho de la sustitución. En la mayoría de los casos, no escapar de los puntos de la izquierda también será inofensivo, a menos que tenga muchas carpetas con nombres similares.
frabjous

3
 ^2.0.1^1.0.8 

El comando anterior intercambia 2.0.1 a 1.0.8 en el último comando, funciona en bash


2

Para garantizar que el -P|-L|-trabajo utilice lo siguiente:

function cd () {
    typeset arg=
    case $1 in -|-L|-P) arg=$1 ; shift ;; esac
    [ $# -gt 1 ] && {
        builtin cd $arg "${PWD/$1/$2}"
    } || {
        builtin cd $arg "$@"
    }
}

1

No estoy seguro acerca de AIX, pero recuerdo esto como un viejo truco de shell Korn en los cuadros de Solaris que solía administrar. En su ejemplo, escribiría el comando:

cd 2.0.1 1.0.8

Un poco más de información aquí .


Esto no funcionó para mí: ubuntu 10.04, bash "GNU bash, versión 4.1.5 (1) -release (i486-pc-linux-gnu)", intenté los siguientes comandos: 2048 cd 2049 cd ~ / src / local -ubuntu-patches / cdtest / dir-v1.0.9 / gnome-control-center-2.30.1 / capplets / network / 2050 cd dir-v1.2.9 dir-v1.0.9 / home / ing02741 / src / local-ubuntu- patches / cdtest / dir-v1.2.9 / gnome-control-center-2.30.1 / capplets / network es una ruta válida.
koushik

@koushik: Escribió que es un truco de Korn. Estás usando bash. bash! = korn. En Ubuntu ksh está disponible a través del paquete 'ksh'.
maxschlepzig

opps, mi mal. Lo siento, pasé por alto esto. @maxschlepzig: gracias por señalarnos.
koushik
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.