Chapter 15: Bash Make Dir (mkdir)
What does mkdir mean?
mkdir = make directory
It creates folders (directories) from the terminal.
Without it you would have to use a file manager → right-click → New Folder → type name → Enter… very slow when doing many folders or deep paths.
1. Simplest way – create one folder
|
0 1 2 3 4 5 6 7 8 |
mkdir photos mkdir backup-2026 mkdir "Project Reports" # use quotes if name has spaces |
After this command → you will see the new empty folder.
Check it:
|
0 1 2 3 4 5 6 |
ls -l # or just ls |
You should see photos, backup-2026, etc.
2. Create many folders at once (very common)
|
0 1 2 3 4 5 6 7 |
mkdir jan feb mar apr may jun jul aug sep oct nov dec mkdir week1 week2 week3 week4 week5 |
Now you have 12 + 5 = 17 folders in one line — super fast!
3. The MOST important option → -p (parents)
This is the one you will use 90% of the time in real scripts/projects.
|
0 1 2 3 4 5 6 7 |
mkdir project/src/components/Header # ↑ this will FAIL if project or project/src or project/src/components don't exist |
But this works perfectly:
|
0 1 2 3 4 5 6 7 8 |
mkdir -p project/src/components/Header mkdir -p ~/Documents/work/2026/reports/monthly/jan mkdir -p logs/error/2026-02 |
What -p does:
- Creates all missing parent folders automatically
- Does NOT give error if the folder already exists (very safe in scripts)
- Very useful for git repos, docker volumes, laravel/cache folders, python virtualenvs, etc.
Real example most developers use daily:
|
0 1 2 3 4 5 6 |
mkdir -p src/{components,pages,utils,hooks,styles,assets/images} |
This creates:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
src/ ├── components/ ├── pages/ ├── utils/ ├── hooks/ ├── styles/ └── assets/ └── images/ |
4. See what is happening → -v (verbose)
|
0 1 2 3 4 5 6 7 |
mkdir -v backup-2026-02-25 mkdir -vp logs/{info,warning,error,critical}/2026-02 |
You will see output like:
|
0 1 2 3 4 5 6 7 8 9 |
mkdir: created directory 'backup-2026-02-25' mkdir: created directory 'logs/info/2026-02' mkdir: created directory 'logs/warning/2026-02' ... |
Very helpful when you want to confirm everything was created.
5. Set permissions at creation time → -m (mode)
Normally new folders get drwxr-xr-x (755) because of your umask.
But you can force specific permissions:
|
0 1 2 3 4 5 6 7 8 9 |
mkdir -m 700 secret-project # only you can enter (drwx------) mkdir -m 750 team-shared # you + group can enter, others read/execute mkdir -m 777 public-dropbox # everyone can write (dangerous – careful!) mkdir -m 2755 important-scripts # setgid bit – new files inherit group |
Common real uses:
- 700 → private keys, credentials, personal notes
- 755 → normal web folders, scripts
- 775 → shared team folders (group write)
6. Brace expansion tricks (Bash super power)
Create many numbered folders quickly:
|
0 1 2 3 4 5 6 7 8 9 |
mkdir -p month-{01..12} # month-01 month-02 ... month-12 mkdir day-{1..31} # day-1 day-2 ... day-31 mkdir server-{a..f} # server-a server-b ... server-f mkdir project-{frontend,backend,docs,tests} |
Even better with -p:
|
0 1 2 3 4 5 6 |
mkdir -p archive/202{4..6}/{jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec} |
This creates a nice yearly/monthly archive structure.
7. Quick cheat-sheet table
| What you want | Command example | Notes |
|---|---|---|
| One normal folder | mkdir notes | Basic |
| Many folders | mkdir old new temp backup | |
| Deep path (safest way) | mkdir -p src/components/Button | Most used |
| See every step | mkdir -vp logs/2026/{01,02,03} | Debugging |
| Private folder (only me) | mkdir -m 700 .ssh/old-keys | Security |
| Team folder (group write) | mkdir -m 775 team-documents | Collaboration |
| Numbered folders | mkdir week-{1..10} | Reports, logs |
| Many nested at once | mkdir -p app/{controllers,models,views,config} | MVC pattern |
| No error if already exists | mkdir -p cache | Scripts love this |
8. Common real-life examples (copy-paste ready)
- Laravel project structure
|
0 1 2 3 4 5 6 |
mkdir -p storage/{framework/{cache,sessions,views},logs,app/public} |
- Python project
|
0 1 2 3 4 5 6 |
mkdir -p myproject/{src/tests,data/{raw,processed},notebooks,docs} |
- Daily log folders (today is 2026-02-25)
|
0 1 2 3 4 5 6 |
mkdir -p ~/logs/$(date +%Y-%m-%d)/{nginx,app,backup} |
- Exam preparation folders
|
0 1 2 3 4 5 6 |
mkdir -p study/2026/{maths/{algebra,calculus},physics/{mechanics,optics},chemistry} |
9. What if I make mistake?
- Folder already exists → normal mkdir says: mkdir: cannot create directory ‘xxx’: File exists
- But with -p → silent (no error) → very safe
- Want to remove empty folder? → use rmdir foldername (only works if empty)
- Want to remove folder + everything inside? → rm -r foldername (careful!)
Now you know mkdir like 95% of Linux users.
Practice these 3 right now in your terminal:
|
0 1 2 3 4 5 6 7 8 9 |
mkdir -p practice/{basic,deep/nested/very/deep} mkdir -v month-{01..03} mkdir -m 700 my-secret-stuff ls -l |
Tell me what you see — or ask: “how to create 100 folders named file-001 to file-100?” or “how to make folders only if I’m in Downloads?” — I’ll show exact commands! 😄
