18

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?

26

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.

17

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.

  • 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 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
7

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
}
  • My +1 is specifically for the Bash-specific references to the last command's arguments. – 0xC0000022L Feb 13 '13 at 20:06
  • +1 for over engineering. Excelsior! :) – mhvelplund Jul 18 '18 at 7:24
3
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

  • this works for me – alhelal Sep 6 '16 at 11:47

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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