Existe um atalho para o mkdir foo e o cd imediatamente?

89

Isso é algo que faço frequentemente

$ mkdir foo
$ cd foo

Isso funciona como um único comando, mas é mais pressionamento de tecla e economiza tempo.

$ mkdir foo && cd foo

Existe um atalho para isso?

Editar

Com o uso da ajuda abaixo, esta parece ser a resposta mais 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
fonte
11
Você pode renomear a função para mkdirse você usar em command mkdir $1vez de apenas mkdir $1no corpo da função.
Andy
2
(1) por que não simplesmente "mkdir $ 1; cd $ 1" em vez de "&&"? dessa forma, o "cd" será bem-sucedido, mesmo que o "mkdir" falhe, e você não precisará dos andaimes do tipo "ele já existe". (2) conforme escrito, sua função não funcionará (para solicitar um nome de diretório). você precisa colocar isso em uma cláusula "if" separada do teste de existência (atualmente em "elif").
quack quixote

Respostas:

45

Eu não sou especialista em Linux / bash, mas tente colocar isso no seu .bashrc.

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

PS Obrigado a Dennis por usar command mkdir.

Andy
fonte
2
Em vez de `which mkdir`, basta usar command mkdir.
Dennis Williamson
11
Obrigado Dennis. Não há nada embaixo man command- você poderia me indicar uma referência? (Eu posso descobrir o que ele faz, mas vale a pena ser completa;)
Andy
2
commandé descrito no manual debash (do qual é incorporado; não é um comando separado). Você também pode tentar help command.
grawity
Isso também funciona para o zsh btw
Florian Loch
94

Os bash, zshShells

Se você não quer que outra função se lembre e não se importe com basismos:

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

A $_variável de comando bash (sublinhado do dólar) contém o parâmetro mais recente. Portanto, se um usuário digitar o seguinte na linha de comando:, echo foo bar && echo $_ baza saída será a seguinte:

foo bar
bar baz

The fishShell

Na casca do peixe, digitei o seguinte:

> mkdir / página inicial / foo / doc / bar
> cd alt + ↑

A tecla alt combinada com a tecla de seta para cima ou para baixo percorre o histórico de parâmetros do comando.

kzh
fonte
4
Isso funciona zshtambém.
Nabil Kadimi
3
Você pode explicar o que $ _ é? Novato aqui.
arg20
@NabilKadimi Você quis dizer que <kbd> Alt <kbd> + <kbd> ⬆ <kbd> funciona bem no Zsh? Na verdade, com zsh 5.4.2 e on-my-zsh, Alt + ⬆ me dá o caractere 'A'.
Fim de semana
+1 para os $ _ - Standy Sexy Flanders!
cig0 29/06
22

Para usuários oh-my-zsh :
$ take 'directory_name'

Referência: https://github.com/robbyrussell/oh-my-zsh/wiki/Cheatsheet

Avijit Gupta
fonte
11
Você pode explicar isso com mais detalhes?
BwDraco
@bwDraco type take, então você receberá take is a shell function from /home/username/.oh-my-zsh/lib/functions.zsh. vi o arquivo, em seguida, você começafunction take() { mkdir -p $@ && cd ${@:$#} }
Weekend
10

Sobre:

$ mkdir newdirname; cd $_

É um pouco mais fácil do que usar &&, combinando as respostas de Quack Quackote e Kzh.

Alex
fonte
26
O ponto de &&é que cdnão será executada se o mkdircomando falhar
slhck
11
@slhck, na verdade, esse era o objetivo do quixote: cd, mesmo que o mkdir falhe (por exemplo, se ele já existir, forçando o usuário a escrever um segundo comando para realmente fazer o cd no caminho). No entanto, ao contrário do que essas respostas dizem, isso não é fácil: && não é mais complicado que;.
moala 02/02
7

Você pode tentar algo como isto:

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

Salve este script em algum lugar que esteja no seu caminho, por exemplo, / usr / local / bin ou ~ / bin (você deve colocar este último no caminho no seu arquivo ~ / .profile). Então você pode simplesmente chamá-lo.

petersohn
fonte
4
como isso pode funcionar? parece apenas cddentro do contexto da execução do ~/bin/mkcdscript, não o chamador do script.
precisa
5
$echo 'mkcd() { mkdir -p "$@" && cd "$_"; }' >> ~/.bashrc
$mkcd < pathtofolder/foldername >
mshameers
fonte
2

Aqui está uma função simples que eu coloquei no meu ~/.config/fish/config.fisharquivo que realiza esta tarefa:

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

A -pvtag permite a criação de diretórios com subdiretórios.

Alex Fenwood Hughes
fonte
0

Dependendo do resultado desejado, se o diretório já existir.

Falha se o diretório já existir

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

Alterar diretório independentemente

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

Uso mkcd some / path / to / my / dir

bingles
fonte
0

Eu descobri que a função abaixo pode criar apenas um diretório, se eu quiser criar subdiretórios ao mesmo tempo, isso não funciona:

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

Então eu mudei e agora está funcionando muito bem!

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