Skip to main content

mkdir — Create Directories Linux coreutils

Directories are the “containers” that keep your server organized: web roots, logs, backups, uploads, and app configs all start with a folder structure.
mkdir (make directory) is the standard Linux command for creating those folders—reliably, script-friendly, and with useful flags for automation.

When you should care

If you deploy apps (WordPress, Node, Laravel), run backups, or manage logs on a VPS, mkdir is one of the most-used commands in your toolbox.

Core Syntax

mkdir [OPTION]... DIRECTORY...
  • You can create one directory or many in a single command.
  • OPTION changes behavior (parents, verbosity, mode, etc.).

Options You’ll Actually Use

OptionMeaningTypical Use
-----
-pCreate parent directories as needed (no error if existing)Automation, nested paths (/a/b/c)
-vVerbose: print message for each created directoryScripts / visibility
-m MODESet permissions at creation timeSecure folders (e.g., 700)
--helpBuilt-in helpQuick lookup
--versionShow versionTroubleshooting consistency
About -m

-m sets the directory mode, similar to running chmod right after creation—useful for secure paths like config or temp upload folders.

Common Patterns

mkdir backups

Best Practices

  • Prefer -p for nested paths (especially in scripts).
  • Use -m for security-sensitive directories at creation time.
  • Use -v in automation so logs clearly show what was created.
  • Avoid spaces in folder names on servers (use my_folder instead of my folder).
Script-friendly habit

If a directory might already exist, mkdir -p is safer than plain mkdir—it avoids breaking deployments.

Benefits

  • Fast and consistent folder creation
  • Makes app structure predictable (WordPress themes/plugins/uploads)
  • Helps automate backups, staging environments, and log organization
  • Reduces permission mistakes by setting mode at creation time (-m)

Troubleshooting

SymptomLikely CauseFix
----
Permission deniedYou lack write permission in target directoryUse sudo, or fix ownership (chown)
No such file or directoryParent folders don’t existAdd -p
Wrong permissions after creationDefault umask applied; -m not usedUse chmod, or recreate with -m
File existsDirectory already existsUse -p or choose a unique name
Quick check commands (HTML)
# Where am I?
pwd

# Who am I?
whoami

# Do I have permission here?
ls -ld .

# Inspect the directory (ownership/permissions)
ls -ld target_dir

Cheat Sheet

mkdir backups # Create single dir
mkdir plugins themes # Multiple dirs
mkdir -p uploads/2025/10 # Nested with parents
mkdir -v staging # Verbose mode
mkdir -m 755 cache # Set permissions

Mini Quiz

  1. What happens if you run mkdir wp-content/uploads/2025/10 without -p and the parent folders don’t exist?
  2. Which option prints confirmation messages for created folders?
  3. How do you set permissions at creation time?
  4. Why is mkdir -p important in automation scripts?
Answers (peek after you try)
  1. It fails with “No such file or directory”. 2) -v. 3) -m MODE. 4) Because scripts shouldn’t break if parents exist or are missing.

Worked Examples (with outputs)

Structure note

Examples are grouped after the explanations so you can learn the concepts first, then apply them.

Create a single directory

mkdir backups

Expected output: (silent success)

Create multiple directories at once

mkdir plugins themes uploads

Expected output: (silent success)

Create nested directories without -p (failure example)

mkdir wp-content/uploads/2025/10

Expected output:

mkdir: cannot create directory ‘wp-content/uploads/2025/10’: No such file or directory

Create nested directories with -p

mkdir -p wp-content/uploads/2025/10

Expected output: (silent success)

Verbose output

mkdir -v new_logs

Expected output:

mkdir: created directory 'new_logs'

Set permissions at creation

mkdir -m 700 private_folder

Expected output: (silent success)

Combine -p and -v

mkdir -pv /backups/mysql/2025/Oct

Expected output:

mkdir: created directory '/backups'
mkdir: created directory '/backups/mysql'
mkdir: created directory '/backups/mysql/2025'
mkdir: created directory '/backups/mysql/2025/Oct'

Create inside system directory (requires sudo)

sudo mkdir /var/log/wp-security

Expected output: (silent success)

Directory name with spaces (quotes required)

mkdir "my custom folder"

Expected output: (silent success)

Verify result

ls -ld backups

Expected output (example):

drwxr-xr-x 2 user user 4096 Oct 2 09:30 backups

Brace expansion (multiple folders fast)

mkdir {css,js,images}

Expected output: (silent success)

Nested brace expansion with parents

mkdir -p wp-content/{plugins,themes,uploads}/2025

Expected output: (silent success)

Directory named with today’s date

mkdir $(date +%Y-%m-%d)

Expected output (example directory name):

2025-10-02/

Directory with timestamp (unique backups)

mkdir backup-$(date +%Y%m%d-%H%M)

Expected output (example):

backup-20251002-0930/

Temporary directory in /tmp

mkdir /tmp/wp-test

Expected output: (silent success)

Secure uploads temp folder (WordPress)

mkdir -m 700 /var/www/html/wp-content/tmp

Expected output: (silent success)

WordPress permission note

On many servers /var/www/html is owned by www-data (or similar). You may need sudo or correct ownership depending on your setup.

Restricted path creation

sudo mkdir /etc/wp-custom

Expected output: (silent success)

Create multiple dated folders in one command

mkdir -p backups/{2024,2025}/{Jan,Feb,Mar}

Expected output: (silent success)

Create multiple project folders

mkdir project_{alpha,beta,gamma}

Expected output: (silent success)

Create and verify immediately

mkdir staging && ls -ld staging

Expected output (example):

drwxr-xr-x 2 user user 4096 Oct 2 staging

Numeric directory name

mkdir 12345

Expected output: (silent success)

Name starts with hyphen (use --)

mkdir -- -cache

Expected output: (silent success)

Create multiple user folders in /home/

sudo mkdir -p /home/{alice,bob,charlie}

Expected output: (silent success)

Dedicated Nginx/Apache logs directory

sudo mkdir -pv /var/log/nginx/wordpress

Expected output:

mkdir: created directory '/var/log/nginx'
mkdir: created directory '/var/log/nginx/wordpress'

Read-only directory (prevent writes)

mkdir -m 555 readonly_dir

Expected output: (silent success)