mkdir Command Guide: Create Directories in Linux/Unix

Master the mkdir command with this complete guide. Learn syntax, options, and examples for creating directories in Linux/Unix systems efficiently.

The mkdir Command: Complete Guide to Creating Directories

Overview

The mkdir command is a fundamental Unix/Linux command-line utility used to create directories (folders) in the file system. The name "mkdir" is an abbreviation for "make directory." This command is essential for organizing files and creating directory structures in both interactive and scripted environments.

Basic Syntax

`bash mkdir [OPTIONS] DIRECTORY_NAME... `

The basic syntax consists of the command name followed by optional flags and one or more directory names to create.

Command Structure

| Component | Description | Required | |-----------|-------------|----------| | mkdir | The command name | Yes | | OPTIONS | Command flags that modify behavior | No | | DIRECTORY_NAME | Name(s) of directories to create | Yes |

Basic Usage Examples

Creating a Single Directory

`bash mkdir documents `

This creates a directory named "documents" in the current working directory.

Creating Multiple Directories

`bash mkdir projects photos music videos `

This command creates four directories simultaneously: projects, photos, music, and videos.

Creating Directories with Spaces in Names

`bash mkdir "My Documents" mkdir 'Project Files' mkdir My\ Important\ Files `

When directory names contain spaces, you must either enclose them in quotes or escape the spaces with backslashes.

Command Options and Flags

Complete Options Table

| Option | Long Form | Description | Example | |--------|-----------|-------------|---------| | -p | --parents | Create parent directories as needed | mkdir -p dir1/dir2/dir3 | | -v | --verbose | Print a message for each created directory | mkdir -v newdir | | -m | --mode | Set file mode (permissions) | mkdir -m 755 securedir | | -Z | --context | Set SELinux security context | mkdir -Z context_type newdir | | --help | | Display help information | mkdir --help | | --version | | Output version information | mkdir --version |

Detailed Option Explanations

#### The -p (--parents) Option

The -p option is one of the most useful features of mkdir. It creates parent directories as needed and does not return an error if the directory already exists.

`bash

Without -p, this would fail if parent directories don't exist

mkdir -p /home/user/projects/web/frontend/src/components

Creating nested directory structure

mkdir -p company/departments/IT/servers/web `

Use Cases for -p: - Creating deep directory structures in one command - Ensuring directory exists without error if it already exists - Scripting scenarios where parent directories may or may not exist

#### The -v (--verbose) Option

The verbose option provides feedback about what directories are being created.

`bash mkdir -v testdir

Output: mkdir: created directory 'testdir'

mkdir -pv project/src/main/java/com/example

Output:

mkdir: created directory 'project'

mkdir: created directory 'project/src'

mkdir: created directory 'project/src/main'

mkdir: created directory 'project/src/main/java'

mkdir: created directory 'project/src/main/java/com'

mkdir: created directory 'project/src/main/java/com/example'

`

#### The -m (--mode) Option

This option sets the file permissions for the newly created directory.

`bash

Create directory with specific permissions (rwxr-xr-x)

mkdir -m 755 publicdir

Create directory with restricted permissions (rwx------)

mkdir -m 700 privatedir

Create directory with read-only permissions for group and others

mkdir -m 744 readonlydir `

Permission Values:

| Octal | Binary | Permissions | Description | |-------|--------|-------------|-------------| | 755 | 111101101 | rwxr-xr-x | Owner: rwx, Group: r-x, Others: r-x | | 750 | 111101000 | rwxr-x--- | Owner: rwx, Group: r-x, Others: none | | 700 | 111000000 | rwx------ | Owner: rwx, Group: none, Others: none | | 644 | 110100100 | rw-r--r-- | Owner: rw-, Group: r--, Others: r-- |

Advanced Usage Examples

Creating Complex Directory Structures

`bash

Create a typical web project structure

mkdir -p mywebsite/{css,js,images,pages,includes}

Create a software project structure

mkdir -p myapp/{src/{main,test}/{java,resources},docs,lib,bin}

Create backup directory structure by date

mkdir -p backups/$(date +%Y)/$(date +%m)/$(date +%d) `

Using Brace Expansion

Brace expansion allows creating multiple directories with similar names efficiently:

`bash

Create directories for different environments

mkdir {development,staging,production}

Create numbered directories

mkdir project_{1..5}

Create directories with multiple variations

mkdir {web,mobile}_{dev,test,prod} `

Combining Multiple Options

`bash

Create directories with verbose output and parent creation

mkdir -pv /opt/myapp/{bin,lib,conf,logs}

Create directories with specific permissions and verbose output

mkdir -vm 750 secure/{private,confidential,restricted} `

Practical Use Cases

System Administration

`bash

Create log directory structure

sudo mkdir -p /var/log/myapp/{error,access,debug}

Create application directories

sudo mkdir -p /opt/myapp/{bin,lib,conf,data}

Create user directories

mkdir -p /home/newuser/{Documents,Downloads,Pictures,Videos} `

Development Projects

`bash

Java project structure

mkdir -p myproject/src/{main,test}/{java,resources}

Web development structure

mkdir -p webapp/{public/{css,js,images},views,routes,models}

Python project structure

mkdir -p python_project/{src,tests,docs,scripts} `

Backup and Organization

`bash

Create backup structure

mkdir -p backups/{daily,weekly,monthly}/{databases,files,configs}

Create media organization

mkdir -p media/{photos,videos,audio}/{2023,2024}/{01..12} `

Error Handling and Troubleshooting

Common Error Messages

| Error Message | Cause | Solution | |---------------|-------|----------| | "No such file or directory" | Parent directory doesn't exist | Use -p option | | "File exists" | Directory already exists | Use -p option or check if intended | | "Permission denied" | Insufficient permissions | Use sudo or change to writable location | | "Invalid argument" | Invalid characters in directory name | Use valid characters, escape special ones |

Error Examples and Solutions

`bash

Error: Parent directory doesn't exist

mkdir deep/nested/directory

mkdir: cannot create directory 'deep/nested/directory': No such file or directory

Solution: Use -p option

mkdir -p deep/nested/directory

Error: Permission denied

mkdir /root/newdir

mkdir: cannot create directory '/root/newdir': Permission denied

Solution: Use sudo

sudo mkdir /root/newdir `

File Permissions and Security

Default Permissions

By default, mkdir creates directories with permissions based on the current umask value:

`bash

Check current umask

umask

Common output: 0022

This means new directories get 755 permissions (777 - 022 = 755)

`

Setting Custom Permissions

`bash

Create directory with full access for owner only

mkdir -m 700 private_dir

Create directory with read/write for owner, read-only for group

mkdir -m 740 shared_dir

Create directory with specific permissions using symbolic notation

(Note: mkdir doesn't support symbolic notation directly, use chmod after)

mkdir newdir && chmod u=rwx,g=rx,o=r newdir `

Integration with Other Commands

Using mkdir in Scripts

`bash #!/bin/bash

Script to create project structure

PROJECT_NAME="$1" if [ -z "$PROJECT_NAME" ]; then echo "Usage: $0 " exit 1 fi

Create project structure

mkdir -p "$PROJECT_NAME"/{src,tests,docs,config} mkdir -p "$PROJECT_NAME"/src/{main,utils}

echo "Project structure created for: $PROJECT_NAME" `

Combining with Other Commands

`bash

Create directory and navigate to it

mkdir myproject && cd myproject

Create directory and create a file inside

mkdir newdir && touch newdir/readme.txt

Create directory and list its parent

mkdir testdir && ls -la

Create multiple directories and show tree structure

mkdir -p project/{src,docs,tests} && tree project `

Best Practices

Naming Conventions

| Practice | Good Example | Poor Example | Reason | |----------|--------------|--------------|---------| | Use descriptive names | user_documents | dir1 | Clarity and maintainability | | Avoid spaces when possible | project_files | project files | Easier command-line usage | | Use consistent case | all_lowercase | MixedCASE | Consistency and predictability | | Avoid special characters | web_assets | web@assets# | Prevents shell interpretation issues |

Directory Organization Tips

`bash

Good: Logical hierarchy

mkdir -p company/departments/{hr,it,finance}/{documents,reports}

Good: Date-based organization

mkdir -p archives/$(date +%Y)/$(date +%B)

Good: Environment separation

mkdir -p deployment/{development,staging,production}/configs `

Security Considerations

`bash

Create secure directories for sensitive data

mkdir -m 700 ~/.ssh mkdir -m 700 ~/private

Create shared directories with appropriate permissions

mkdir -m 755 /var/www/html/public mkdir -m 750 /var/log/applications `

Performance and Efficiency

Batch Operations

`bash

Efficient: Create multiple directories at once

mkdir dir1 dir2 dir3 dir4 dir5

Less efficient: Create directories one by one

mkdir dir1 mkdir dir2 mkdir dir3 mkdir dir4 mkdir dir5 `

Using Variables and Loops

`bash

Using variables

BASE_DIR="/opt/myapp" mkdir -p "$BASE_DIR"/{bin,lib,conf,logs,data}

Using loops for numbered directories

for i in {1..10}; do mkdir -p "project_$i"/{src,tests,docs} done `

Cross-Platform Considerations

Linux/Unix Systems

`bash

Standard usage on Linux/Unix

mkdir -p /home/user/projects

Using with SELinux contexts (Linux-specific)

mkdir -Z user_home_t /home/user/newdir `

macOS Differences

On macOS, mkdir behaves similarly to Linux, but some advanced options may differ:

`bash

macOS supports most standard options

mkdir -p ~/Documents/Projects

Some Linux-specific options may not be available

`

Windows Compatibility

When working in Windows environments or preparing scripts for cross-platform use:

`bash

Use forward slashes (work on most systems)

mkdir -p project/src/main

Avoid Windows-reserved names

Don't use: CON, PRN, AUX, NUL, COM1-9, LPT1-9

`

Troubleshooting Guide

Common Issues and Solutions

| Issue | Symptoms | Diagnosis | Solution | |-------|----------|-----------|----------| | Permission denied | Cannot create directory | ls -ld parent_directory | Use sudo or change location | | Directory exists | Error message about existing directory | ls -la to check | Use -p option or different name | | Invalid characters | Shell errors or unexpected behavior | Check for special characters | Escape or quote directory names | | Disk full | "No space left on device" | df -h to check disk space | Free up space or use different location |

Debugging Commands

`bash

Check current directory

pwd

Check permissions of parent directory

ls -ld .

Check available disk space

df -h .

Check if directory already exists

ls -la dirname 2>/dev/null && echo "exists" || echo "does not exist" `

Related Commands

Directory Navigation and Management

| Command | Purpose | Example | |---------|---------|---------| | cd | Change directory | cd newdir | | rmdir | Remove empty directory | rmdir olddir | | rm -r | Remove directory and contents | rm -r dirname | | ls | List directory contents | ls -la dirname | | tree | Display directory tree | tree dirname | | find | Find directories | find . -type d -name "pattern" |

File Operations

`bash

Create directory and file together

mkdir project && touch project/README.md

Create directory structure and populate with files

mkdir -p project/{src,docs,tests} touch project/src/main.py project/docs/README.md project/tests/test_main.py `

Conclusion

The mkdir command is an essential tool for file system management and organization. Understanding its various options and use cases enables efficient directory creation and management in both interactive and automated environments. From simple single directory creation to complex nested structures, mkdir provides the flexibility needed for modern system administration and development workflows.

Key takeaways include using the -p option for creating parent directories, the -m option for setting permissions, and the -v option for verbose output. Combining mkdir with other commands and using it in scripts can significantly improve productivity and system organization.

Regular practice with different mkdir options and scenarios will help develop proficiency in command-line directory management and contribute to more effective system administration and development practices.

Tags

  • Command Line
  • Linux
  • Unix
  • file-system
  • shell

Related Articles

Popular Technical Articles & Tutorials

Explore our comprehensive collection of technical articles, programming tutorials, and IT guides written by industry experts:

Browse all 8+ technical articles | Read our IT blog

mkdir Command Guide: Create Directories in Linux/Unix