Existe-t-il un raccourci vers mkdir foo et un cd immédiatement?

89

C'est quelque chose que je fais fréquemment

$ mkdir foo
$ cd foo

Cela fonctionne comme une seule commande, mais cela prend plus de frappe et ne fait pas gagner du temps.

$ mkdir foo && cd foo

Y a-t-il un raccourci pour cela?

Modifier

Avec l'aide de l'aide ci-dessous, cela semble être la réponse la plus élégante.

# ~/.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
la source
1
Vous pouvez renommer la fonction mkdirsi vous utilisez command mkdir $1plutôt que mkdir $1dans le corps de la fonction.
Andy
2
(1) pourquoi ne pas simplement "mkdir $ 1; cd $ 1" au lieu de "&&"? de cette façon, le "cd" réussit même si le "mkdir" échoue, et vous n'avez pas besoin de l'échafaudage existant. (2) tel qu'écrit, votre fonction ne fonctionnera pas (pour vous demander un nom de répertoire). vous devez mettre cela dans une clause "if" distincte du test d'existence (actuellement dans "elif").
Quack Quotote

Réponses:

45

Je ne suis pas un expert Linux / bash, mais essayez de mettre ceci dans votre .bashrc.

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

PS Merci à Dennis d'avoir utilisé command mkdir.

Andy
la source
2
Au lieu de `which mkdir`, utilisez simplement command mkdir.
Dennis Williamson
1
Merci Dennis. Il n'y a rien en dessous man command- pourriez-vous me diriger vers une référence? (Je peux comprendre ce qu'il fait, mais il faut payer pour être approfondi;)
Andy
2
commandest décrit dans le manuel debash (dont il fait partie intégrante; ce n'est pas une commande séparée). Tu pourrais aussi essayer help command.
Grawity
Cela fonctionne aussi pour zsh btw
Florian Loch
94

Les bash, zshCoquilles

Si vous ne voulez pas qu'une autre fonction soit mémorisée et ne craignez pas les bashismes:

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

La $_variable de commande bash (soulignement dollar) contient le paramètre le plus récent. Donc, si un utilisateur devait taper ce qui suit sur la ligne de commande:, echo foo bar && echo $_ bazle résultat serait le suivant:

foo bar
bar baz

La fishcoquille

Dans la coquille de poisson, je taperais ce qui suit:

> mkdir / home / toto / doc / bar
> cd alt + ↑

La touche Alt combinée avec la touche fléchée haut ou bas permet de parcourir l'historique des paramètres de commande.

kzh
la source
4
Cela fonctionne zshaussi.
Nabil Kadimi
3
Pouvez-vous expliquer ce qu'est $ _? Débutant ici.
arg20
@NabilKadimi Voulez-vous dire que <kbd> Alt <kbd> + <kbd> ⬆ <kbd> fonctionne bien dans Zsh? En fait, avec zsh 5.4.2 et on-my-zsh, Alt + me donne le caractère 'A'.
Week
+1 pour le $ _ - Stupid Sexy Flanders!
cig0
22

Pour les utilisateurs de oh-my-zsh :
$ take 'directory_name'

Référence: https://github.com/robbyrussell/oh-my-zsh/wiki/Cheatsheet

Avijit Gupta
la source
1
Pouvez-vous expliquer cela plus en détail?
bwDraco
@ bwDraco type take, alors vous obtiendrez take is a shell function from /home/username/.oh-my-zsh/lib/functions.zsh. vi le fichier alors vous obtenezfunction take() { mkdir -p $@ && cd ${@:$#} }
Week
10

Qu'en est-il de:

$ mkdir newdirname; cd $_

C’est un peu plus facile que d’utiliser &&, en combinant les réponses de Quack Quichote et de KZH.

Alex
la source
26
Le point de &&est que cdne sera pas exécuté si la mkdircommande échoue
slhck
1
@slhck en fait c'était le but de quixote: cd même si mkdir échouait (par exemple, s'il existait déjà, obligeant l'utilisateur à écrire une deuxième commande pour réellement cd dans le chemin). Cependant, contrairement à ce que cette réponse dit, ce n’est pas pour la facilité: && n’est pas plus compliqué que;.
Moala
7

Vous pouvez essayer quelque chose comme ça:

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

Enregistrez ce script dans un emplacement de votre chemin, par exemple, / usr / local / bin ou ~ / bin (vous devez mettre ce dernier dans votre chemin dans votre fichier ~ / .profile). Ensuite, vous pouvez simplement l'appeler.

Petersohn
la source
4
Comment cela peut-il fonctionner? il semble que ce ne soit que cddans le contexte de l'exécution du ~/bin/mkcdscript, pas l'appelant du script.
Erik Allik
5
$echo 'mkcd() { mkdir -p "$@" && cd "$_"; }' >> ~/.bashrc
$mkcd < pathtofolder/foldername >
mshameers
la source
2

Voici une fonction simple que j'ai mise dans mon ~/.config/fish/config.fishfichier et qui accomplit cette tâche:

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

La -pvbalise permet la création de répertoires avec des sous-répertoires.

Alex Fenwood Hughes
la source
0

En fonction du résultat souhaité si le répertoire existe déjà.

Echec si le répertoire existe déjà

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

Changer de répertoire quand même

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

Utilisation mkcd some / path / to / my / dir

bingles
la source
0

J'ai trouvé que la fonction ci-dessous ne peut créer qu'un seul répertoire. Si je veux créer des sous-répertoires en même temps, cela ne fonctionne pas:

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

Alors je l'ai changé et maintenant ça marche très bien!

function mkcd
{
  command mkdir -pv $1 && cd $1 && echo "Now in `pwd`"
}
utilisateur5723841
la source