104

This is something I do frequently

$ mkdir foo
$ cd foo

This works as a single command, but it's more keystrokes and saves no time.

$ mkdir foo && cd foo

Is there a shortcut for this?

Edit

With the use of help below, this seems to be the most elegant answer.

# ~/.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
}
3
  • 1
    You can rename the function to mkdir if you use command mkdir $1 instead of just mkdir $1 in the function body.
    – Andy
    Jun 15, 2010 at 14:50
  • 3
    (1) why not simply "mkdir $1 ; cd $1" instead of "&&"? that way the "cd" succeeds even if the "mkdir" fails, and you don't need the does-it-already-exist scaffolding. (2) as written your function won't work (to prompt you for a directory name). you need to put that in a separate "if" clause from the existence test (currently in "elif"). Jun 15, 2010 at 16:25
  • Or even mkdir -p $1; cd $1 so you can make nested directories and move into them. @quackquixote Oct 6, 2021 at 3:58

11 Answers 11

47

I'm no Linux/bash expert, but try putting this in your .bashrc.

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

PS Thanks to Dennis for using command mkdir.

4
  • 2
    Instead of `which mkdir`, just use command mkdir. Jun 15, 2010 at 14:33
  • 1
    Thanks Dennis. There's nothing under man command - could you direct me to a reference? (I can work out what it does, but it pays to be thorough;)
    – Andy
    Jun 15, 2010 at 14:49
  • 2
    command is described in the manual of bash (which it is a built-in of; it's not a separate command). You could also try help command.
    – user1686
    Jun 15, 2010 at 18:39
  • That also works for zsh btw Dec 23, 2014 at 11:37
113

The bash, zsh Shells

If you don't want another function to remember and don't mind bashisms:

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

The $_ (dollar underscore) bash command variable contains the most recent parameter. So if a user were to type the following at the command line: echo foo bar && echo $_ baz, then the output would be as follows:

foo bar
bar baz

The fish Shell

In the fish shell, I would type the following:

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

The alt key combined with either the up or the down arrow key will cycle through command parameter history.

5
  • 4
    This works in zsh too. Feb 16, 2014 at 10:01
  • 3
    Can you explain what $_ is? Newbie here.
    – arg20
    Jun 25, 2014 at 15:16
  • @NabilKadimi Did you mean that <kbd>Alt<kbd>+<kbd>⬆<kbd> works well in Zsh? Actually, with zsh 5.4.2 and on-my-zsh, Alt+⬆ gives me character 'A'.
    – Weekend
    Apr 9, 2019 at 5:58
  • Put $_ in quotes as in "$_".
    – Asclepius
    Oct 19, 2020 at 13:39
  • Yeah, that's why I don't use Bourne derived shells. Too many foot guns.
    – kzh
    Oct 19, 2020 at 17:22
45

For oh-my-zsh users:
$ take 'directory_name'

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

2
  • 1
    Can you explain this in more detail?
    – bwDraco
    Jul 13, 2015 at 5:47
  • 1
    @bwDraco type take, then you will get take is a shell function from /home/username/.oh-my-zsh/lib/functions.zsh. vi the file then you get function take() { mkdir -p $@ && cd ${@:$#} }
    – Weekend
    Apr 9, 2019 at 8:59
11

What about:

$ mkdir newdirname; cd $_

It's a bit easier than using &&, combining quack quixote's and kzh's answers.

2
  • 28
    The point of && is that cd will not be executed if the mkdir command fails
    – slhck
    Mar 14, 2012 at 9:29
  • 1
    @slhck actually that was the point of quixote: cd even if mkdir fails (for instance if it already exists, forcing the user to write a second command to actually cd to the path). However contrarily to what this answers says, that's not for easiness: && is not more complicated than ;.
    – moala
    Feb 2, 2013 at 9:13
8

You can try something like this:

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

Save this script to some place that is in your path, for example, /usr/local/bin or ~/bin (you have to put this last one into your path in your ~/.profile file). Then you can simply call it.

1
  • 5
    how can this work? it seems to only cd inside the context of the execution of the ~/bin/mkcd script, not the caller of the script. Oct 13, 2013 at 16:15
6
$echo 'mkcd() { mkdir -p "$@" && cd "$_"; }' >> ~/.bashrc
$mkcd < pathtofolder/foldername >
5

Here is a simple function I put in my ~/.config/fish/config.fish file which accomplishes this task:

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

The -pv tag allows for the creation of directories with sub-directories.

1

If you use zsh there is a cool shortcut:

take <Your_folder_name>

and it will create a folder and change to it ;)

0

Depending on the desired outcome if the directory already exists.

Fail if directory already exists

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

Change directory regardless

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

Usage mkcd some/path/to/my/dir

0

I found that the function below can only make one directory, if I want to make subdirectories at the same time, it doesn't work :

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

So I changed it and now its working great!

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

For this is the only way it worked for me

function md
{
  command mkdir -vp $1 && command cd $1 && echo "Now in `pwd`"
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.