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?

4 Answers 4

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.

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.

3
  • mkdir "NewDir" && cd "$_" works great than mkdir "NewDir" && cd "NewDir" as auto complete doesn't work. BTW what is "$_" ? Jan 30, 2013 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. Jan 30, 2013 at 10:14
  • @TheKojuEffect $_ see 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, 2013 at 14:39
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
}
2
  • My +1 is specifically for the Bash-specific references to the last command's arguments. Feb 13, 2013 at 20:06
  • 1
    +1 for over engineering. Excelsior! :)
    – mhvelplund
    Jul 18, 2018 at 7:24
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

1
  • this works for me
    – alhelal
    Sep 6, 2016 at 11:47

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .