Un golpe de una sola línea para cambiar al directorio donde se encuentra algún archivo

StackOverflow https://stackoverflow.com/questions/855616

  •  21-08-2019
  •  | 
  •  

Pregunta

A menudo me quiero cambiar al directorio donde se encuentra un ejecutable en particular. Así que me gustaría algo así como

cd `which python` 

para cambiar al directorio donde está instalado el comando python. Sin embargo, esto es obviamente ilegal, puesto que el CD tiene un directorio, no un archivo. Es evidente que hay alguna expresión regular-foo que podía hacer para quitarse el nombre del archivo, pero eso sería contrario al punto de que sea una herramienta fácil de una sola línea.

¿Fue útil?

Solución

A continuación:

cd $(dirname `which python`)

Editar:

Aún más fácil (en realidad probado esta vez):

function cdfoo() { cd $(dirname `which $@`); }

A continuación, "pitón cdfoo".

Otros consejos

Para evitar todos esos programas externos ( 'nombredir' y mucho peor, lo inútil, pero popular 'que') tal vez un poco reescrita:

cdfoo() {
  tgtbin=$(type -P "$1")
  [[ $? != 0 ]] && {
    echo "Error: '$1' not found in PATH" >&2
    return 1
  }
  cd "${tgtbin%/*}"
}

Esto también corrige la palabra clave 'función' raro desde arriba y añade (muy simple) el tratamiento de errores.

Puede ser un comienzo para una solución más sphisticated.

Para la comparación:

zsh:~% cd =vi(:h)
zsh:/usr/bin%

= cmd se expande a la ruta de acceso a CMD y (: h) es un modificador de glob para tomar la cabeza

zsh es de sólo escritura pero de gran alcance.

algo así como que debe hacer el truco:

cd `dirname $(which python)`

Una de las características que he usado es adjudicar pushd / popd. Estos mantener una pila de directorios de modo que usted no tiene que tratar de mantener la historia de donde estabas si desea volver al directorio de trabajo actual antes de cambiar directorios.

Por ejemplo:

pushd $(dirname `which $@`)
...
popd

Usted podría utilizar algo como esto:

cd `which <file> | xargs dirname`

he añadido un poco de control de errores simple que hace que el comportamiento de cdfoo () siga la de nombredir de argumentos inexistente / nonpath

function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top