How To Make A New Directory In Linux

How To Make A New Directory In Linux

Reading time1 min
#Linux#Commands#Tech#mkdir#Shell#Scripting

Mastering Directory Creation in Linux: Practical Details with mkdir

Creating directories in Linux isn’t just about typing mkdir foo and moving on. In production environments, overlooking directory permissions, existing paths, or script idempotence causes hard-to-trace errors—especially in CI jobs, deployment hooks, or data pipelines.

Below: tested conventions, non-obvious flags, and mistakes seen most often in the field.


Creating Directories: The Core Command

mkdir reports

Creates reports in the current working directory. If reports exists already, you’ll see:

mkdir: cannot create directory 'reports': File exists

A common issue when you rerun setup scripts. Ignore this at your own risk—scripts failing mid-run due to this often leave systems half-configured.


Problem: Building Nested Paths

Typical use case—project structure scaffolding (e.g., /srv/app/data/processed):

mkdir /srv/app/data/processed

Fails if /srv/app/data isn’t present. Automation breaks here.

Solution: The -p (parents) Flag

Critically, -p recursively creates all missing parent directories, making setup scripts idempotent:

mkdir -p /srv/app/data/processed
  • No error if any parent exists already.
  • Quietly succeeds on subsequent runs—enabling repeatable deployments.

Side note: On older distributions (coreutils < 8.30), expect behavior nuances with corner cases (e.g., relative symlinks in parent paths).


Enforcing Directory Permissions at Creation

Consider security: by default, mkdir applies the current process umask. That’s usually 0022 on most distributions, producing drwxr-xr-x—sometimes too permissive.

Set permissions inline:

mkdir -m 750 team_shared
  • Owner: full access
  • Group: read/execute
  • Others: no access

Combine with -p for nested secure trees in a single step:

mkdir -p -m 700 /srv/secure/financial/reports

Gotcha: If parents exist already with broader permissions, only the final element obeys the specified mode. Use chmod after mkdir -p for full tree lock-down if that’s a concern.


Confirming Actions: The -v (verbose) Flag

When automating with shell scripts, knowing what was actually created is vital for debugging:

mkdir -pv /tmp/batch/2024-logs

Sample output:

mkdir: created directory '/tmp/batch'
mkdir: created directory '/tmp/batch/2024-logs'

Notably, with -p, you won’t get errors if directories already exist. Pair with -v during develop/test; drop it in silent pipelines.


Handling Spaces & Special Characters

Filenames like Project Alpha are common in user-facing or cross-platform directory trees.

  • Escape spaces: mkdir Project\ Alpha
  • Or quote: mkdir "Project Alpha"

Note: In scripts, always prefer quotes to handle unexpected user input with spaces or symbols. Also, avoid unescaped wildcards in dynamic directory names.


Dynamic Directories via Command Substitution

Automated backups, log exports, or pipeline outputs benefit from dynamic naming:

today=$(date +%Y-%m-%d)
mkdir -p "/var/backups/db/$today"
  • Guarantees a per-day backup directory.
  • Handles re-runs cleanly—avoiding failed tasks due to pre-existing paths.

Caution: Avoid using seconds-level granularity with date +%s for top-level dirs—harder to trace or clean up.


Quick Reference: Useful mkdir Flags

OptionFunctionExample
-pCreate parent directories as neededmkdir -p /opt/project/releases/2024
-mSet permissions (mode) at creationmkdir -m 2750 group_space
-vVerbose output; see what’s createdmkdir -pv /tmp/archive/{daily,monthly}

Non-Obvious Tips from Field Use

  • Idempotency: Always use mkdir -p in automation. Avoids brittle scripts.
  • Permissions edge case: To enforce group sticky bit (e.g., for team-shared dirs):
    mkdir -m 2770 team_files
    
    This allows all group members to create/manage files with the parent’s group ownership.
  • Symlink collisions: If a pathname element is a symlink to a directory, mkdir -p treats it as a directory. Plan accordingly if scripts rewrite deprecated paths.
  • Audit trails: Pair verbose flag with tee/logging for compliance when provisioning data directories.

Known issue: Some distributions alias mkdir in shell profiles—double-check via type mkdir if results are unexpected.


Wrapping Up

Directory management rarely fails in small scripts but is often the source of production bugs at scale—wrong permissions, missing paths, non-repeatable setups. The right blend of mkdir -p, permission hygiene, and logging makes larger automation robust.

Before shipping a script or a helm chart, test directory logic on a system with a locked-down umask to catch brittle assumptions.

For edge cases—ACL enforcement, NFS idiosyncrasies, SELinux labels—plain mkdir isn’t enough. At that point, look into install -d as a drop-in with finer controls.


Questions, alternate patterns, or corner-case failures? Share below.