Creating Directories

Directories are just containers for files. Creating them is straightforward.

Basic mkdir

Terminal
$mkdir projects
$ls -l
drwxr-xr-x 2 user user 4096 Jan 14 10:00 projects

The d at the start confirms it's a directory.

Create Multiple Directories

Terminal
$mkdir docs tests config
$ls
config docs tests

The -p Flag (Parents)

Here's where it gets useful. Without -p:

Terminal
$mkdir projects/webapp/src
mkdir: cannot create directory 'projects/webapp/src': No such file or directory

The error occurs because projects/webapp/ doesn't exist yet. With -p:

Terminal
$mkdir -p projects/webapp/src
$ls -R projects
projects: webapp projects/webapp: src

-p creates parent directories as needed. It's so useful that I almost always use it.

Always Use -p

mkdir -p never fails if the directory already exists. It's safer and more convenient. Make it your default.

Create a Standard Project Structure

Terminal
$mkdir -p myapp/{src,tests,docs,config}
$ls myapp
config docs src tests

Brace expansion + -p = instant project scaffolding.

More complex example:

hljs bash
mkdir -p project/{src/{components,utils,styles},tests/{unit,integration},docs/{api,guides}}
Terminal
$tree project
project ├── docs │ ├── api │ └── guides ├── src │ ├── components │ ├── styles │ └── utils └── tests ├── integration └── unit

Create and Enter

Common pattern: create a directory and immediately cd into it:

Terminal
$mkdir -p newproject && cd newproject
$pwd
/home/user/newproject

The && Operator

&& means "run the second command only if the first succeeds." If mkdir fails, cd won't run.

Directory Permissions

New directories get default permissions based on your umask:

Terminal
$mkdir testdir
$ls -ld testdir
drwxr-xr-x 2 user user 4096 Jan 14 10:00 testdir

755 is typical: owner has full access, others can read and enter.

You can specify permissions at creation:

Terminal
$mkdir -m 700 private
$ls -ld private
drwx------ 2 user user 4096 Jan 14 10:00 private

What mkdir Can't Do

  • Won't overwrite existing directories (safe by default)
  • Won't create files (use touch for that)
  • Won't set ownership (use chown after)
Terminal
$mkdir existing_dir
mkdir: cannot create directory 'existing_dir': File exists
$mkdir -p existing_dir
(no error - -p ignores existing)
Knowledge Check

What does `mkdir -p a/b/c` do if `a/` doesn't exist?

Key Takeaways

  • mkdir dirname creates a directory
  • mkdir -p path/to/dir creates entire directory chains
  • -p also silently succeeds if directory already exists
  • Use brace expansion for complex structures: {a,b,c}
  • Combine with && to create and enter: mkdir -p dir && cd dir

Next: copying files and directories.