23

I'm seeking a way to create directory and change my present working directory to newly created directory just by using a single command. How can I do this?

i.e Instead of doing

user@Computer:~$ mkdir NewDirectory
user@Computer:~$ cd NewDirectory
user@Computer:~/NewDirectory$ 

I want to do

user@computer:~$ **command** NewDirectory
user@Computer:~/NewDirectory$

What can the command be?

Seth
  • 59,442
  • 44
  • 149
  • 201

4 Answers4

28

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.

muru
  • 207,970
Michael
  • 501
23

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.

Rinzwind
  • 310,127
  • mkdir "NewDir" && cd "$_" works great than mkdir "NewDir" && cd "NewDir" as auto complete doesn't work. BTW what is "$_" ? – TheKojuEffect Jan 30 '13 at 10:13
  • More than that it would be quite handy if we can attach a switch to mkdir to change to new directory created. – TheKojuEffect Jan 30 '13 at 10:14
  • @TheKojuEffect $_ see http://www.gnu.org/software/bash/manual/bashref.html#Lists Regarding that last one: nobody is stopping you from using an alias or a function inside .bashrc ;) – Rinzwind Jan 30 '13 at 14:39
  • @TheKojuEffect that kind of thinking leads to a ribbon and a mascot. You have the tools you need and they all do one thing well, not everything poorly in slightly different ways. – Ed Swangren Aug 19 '24 at 00:10
8

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
}
4
mkdir -p "as/many dirs/as you/want" && cd "$_"

there is a solution listed above (same as my solution but with no -p option), but I think it has a few pitfalls.

man mkdir
...
-p, --parents
       no error if existing, make parent directories as needed
...

This gives us two benefits:

  1. We can create as many subdirectories as needed in one go
  2. If the directory exists, it will not throw an error, and we will be still able to switch to the existing directory.

&& cd "$_" will change to the newly created directory, since $_ hold the value returned my mkdir

thebugfinder
  • 2,341
  • this works for me – alhelal Sep 06 '16 at 11:47
  • "...since $_ [will] hold the value returned [by] mkdir" - commands (+functions et al) don't return strings, only stat codes. $_ holds the expanded value of mkdir's last argument. https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#:~:text=_,in%20the%20foreground%2C%20after%20expansion. – Ed Swangren Aug 19 '24 at 00:28