¿Hay un atajo para mkdir foo e inmediatamente cd en él?

89

Esto es algo que hago frecuentemente

$ mkdir foo
$ cd foo

Esto funciona como un solo comando, pero es más pulsaciones de teclas y no ahorra tiempo.

$ mkdir foo && cd foo

¿Hay un atajo para esto?

Editar

Con el uso de ayuda a continuación, esta parece ser la respuesta más elegante.

# ~/.bashrc
function mkcd {
  if [ ! -n "$1" ]; then
    echo "Enter a directory name"
  elif [ -d $1 ]; then
    echo "\`$1' already exists"
  else
    mkdir $1 && cd $1
  fi
}
macek
fuente
1
Puede cambiar el nombre de la función a mkdirsi la usa en command mkdir $1lugar de solo mkdir $1en el cuerpo de la función.
Andy
2
(1) ¿por qué no simplemente "mkdir $ 1; cd $ 1" en lugar de "&&"? de esa manera el "cd" tiene éxito incluso si el "mkdir" falla, y no necesita el andamiaje de si ya existe. (2) como está escrito, su función no funcionará (para solicitarle un nombre de directorio). necesita poner eso en una cláusula "if" separada de la prueba de existencia (actualmente en "elif").
quack quijote

Respuestas:

45

No soy un experto en Linux / bash, pero intenta poner esto en tu .bashrc.

function mkdir
{
  command mkdir $1 && cd $1
}

PD: Gracias a Dennis por usar command mkdir.

Andy
fuente
2
En lugar de `which mkdir`, solo úsalo command mkdir.
Dennis Williamson
1
Gracias Dennis No hay nada debajo man command, ¿podría dirigirme a una referencia? (Puedo resolver lo que hace, pero vale la pena ser minucioso;)
Andy
2
commandse describe en el manual debash (que está integrado; no es un comando separado). También podrías intentarlo help command.
Grawity
Eso también funciona para zsh por cierto
Florian Loch
94

El bash, zshconchas

Si no desea que otra función recuerde y no le importe el basismo:

$ mkdir /home/foo/doc/bar && cd $_

La $_variable de comando bash (subrayado en dólares) contiene el parámetro más reciente. Entonces, si un usuario escribiera lo siguiente en la línea de comando:, echo foo bar && echo $_ bazla salida sería la siguiente:

foo bar
bar baz

La fishcáscara

En la concha de pescado, escribiría lo siguiente:

> mkdir / inicio / foo / doc / bar
> cd alt + ↑

La tecla alt combinada con la tecla de flecha hacia arriba o hacia abajo pasará por el historial de parámetros de comando.

kzh
fuente
44
Esto también funciona zsh.
Nabil Kadimi
3
¿Puedes explicar qué es $ _? Novato aquí.
arg20
@NabilKadimi ¿Quiso decir que <kbd> Alt <kbd> + <kbd> ⬆ <kbd> funciona bien en Zsh? En realidad, con zsh 5.4.2 y on-my-zsh, Alt + ⬆ me da el carácter 'A'.
Fin de semana
¡+1 por $ _ - Estúpidos Flandes Sexy!
cig0
22

Para usuarios de oh-my-zsh :
$ take 'directory_name'

Referencia: https://github.com/robbyrussell/oh-my-zsh/wiki/Cheatsheet

Avijit Gupta
fuente
1
¿Puedes explicar esto con más detalle?
bwDraco
@bwDraco type take, entonces obtendrás take is a shell function from /home/username/.oh-my-zsh/lib/functions.zsh. vi el archivo que obtienesfunction take() { mkdir -p $@ && cd ${@:$#} }
Fin de semana
10

Qué pasa:

$ mkdir newdirname; cd $_

Es un poco más fácil que usar &&, combinando las respuestas de quack quixote y kzh.

Alex
fuente
26
El punto &&es que cdno se ejecutará si el mkdircomando falla
slhck
1
@slhck en realidad ese era el punto del quijote: cd incluso si mkdir falla (por ejemplo, si ya existe, lo que obliga al usuario a escribir un segundo comando para realmente cd en la ruta). Sin embargo, al contrario de lo que dice esta respuesta, no es fácil: && no es más complicado que;.
moala
7

Puedes probar algo como esto:

#!/bin/sh
mkdir $1 && cd $1

Guarde este script en algún lugar que esté en su ruta, por ejemplo, / usr / local / bin o ~ / bin (debe colocar este último en su ruta en su archivo ~ / .profile). Entonces puedes simplemente llamarlo.

Petersohn
fuente
44
¿Cómo puede funcionar esto? parece solo cddentro del contexto de la ejecución del ~/bin/mkcdscript, no el llamador del script.
Erik Allik
5
$echo 'mkcd() { mkdir -p "$@" && cd "$_"; }' >> ~/.bashrc
$mkcd < pathtofolder/foldername >
mshameers
fuente
2

Aquí hay una función simple que puse en mi ~/.config/fish/config.fisharchivo que realiza esta tarea:

function mkcd
    mkdir -pv $argv;
    cd $argv;
end

La -pvetiqueta permite la creación de directorios con subdirectorios.

Alex Fenwood Hughes
fuente
0

Dependiendo del resultado deseado si el directorio ya existe.

Falla si el directorio ya existe

mkcd() {
    mkdir $1 && cd $1
}

Cambiar directorio independientemente

mkcd() {
    mkdir $1 ; cd $1
}

Uso de mkcd some / path / to / my / dir

bingles
fuente
0

Descubrí que la siguiente función solo puede hacer un directorio, si quiero hacer subdirectorios al mismo tiempo, no funciona:

function mkdir
{
  command mkdir $1 && cd $1
}

Así que lo cambié y ahora funciona muy bien.

function mkcd
{
  command mkdir -pv $1 && cd $1 && echo "Now in `pwd`"
}
usuario5723841
fuente