How can I create a directory and change my working directory to the new directory?

If you really want it to be just one command, I suggest adding something like this to your .bashrc:

md () { mkdir -p "$@" && cd "$1"; }

Entering md foo on the command line will then create a directory called foo and cd into it immediately afterwards. Please keep in mind, that you will have to reload your .bashrc for the changes to take effect (i.e. open a new console, or run source ~/.bashrc).

Cf. http://www.commandlinefu.com/commands/view/3613/create-a-directory-and-change-into-it-at-the-same-time for possible alternatives, too.


mkdir "NewDirectory" && cd "NewDirectory"

  • The part behind the && will only execute if the 1st command succeeds.
  • It is called a Lists of Commands in the Bash manual.
  • There is also a shorthand version:

    mkdir "NewDirectory" && cd "$_"
    
  • Example from command line:

    $ false && echo "yes"
    $ true && echo "yes"
    yes
    
  • (edit) Add " to the commands since the directory might contain a space.


There's no built-in function for that, but you can use shell functionality to help you not have to type the argument of the cd command again after running mkdir:

  • Type cd , then Esc . (or Alt+.) to insert the last argument from the previous command.
  • cd !$ executes cd on the last argument of the previous command.
  • Press Up to recall the previous command line, then edit it to change mkdir into cd.

You can define a simple make-and-change-directory function in your ~/.bashrc:

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

Reload your .bashrc (. ~/.bashrc) or restart bash, and now you can type mkcd new-directory.

This simple version fails in some unusual cases involving weird directory names or .. and symbolic links. Here's one that does. For explanations, see the Unix & Linux version of this question.

mkcd () {
  case "$1" in
    /*) mkdir -p "$1" && cd "$1";;
    */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "$1";;
    ../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
    *) mkdir -p "./$1" && cd "./$1";;
  esac
}

Tags:

Command Line