こちらからSWELLを購入できます 詳しくはこちら

【Linux】mkdirコマンド完全ガイド ディレクトリを作成する

  • URLをコピーしました!

今回はLinuxコマンドであるmkdirコマンドについて解説します

mkdirコマンドは、新しいディレクトリ(フォルダ)を作成するコマンドです
作業用のディレクトリ作りから、プロジェクトの階層をまとめて作る場面、シェルスクリプトでの準備処理まで、毎日のように使うコマンドなので、ぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます

スポンサーリンク
目次

mkdirコマンドとは??

mkdirコマンドは、指定した名前のディレクトリを作成するコマンドです
名前は「make directory(ディレクトリを作る)」の略です
ディレクトリ名を複数並べると一度にまとめて作れて、-pオプションを付けると途中の親ディレクトリもまとめて作れます
作られるディレクトリの権限は、umask(権限を引く設定)によって決まり、-mオプションで直接指定することもできます
この記事の実行結果は、GNU coreutils 9.4のmkdir(Ubuntu 24.04)を一般ユーザー(user)で実行して確認しています

mkdirコマンドの主なオプション

mkdirコマンドの主なオプションは次のとおりです

オプション意味
-p (–parents)途中の親ディレクトリが存在しなくても、必要なディレクトリをまとめて作成するオプション
-m (–mode)作成するディレクトリの権限(パーミッション)を指定するオプション
-v (–verbose)ディレクトリを作成するたびに、作成したディレクトリ名を表示するオプション

ここからは、テスト用のディレクトリmkdir-testの中で説明します
次のコマンドで同じ環境を作れるので、一緒に試してみてください

事前準備(テスト用ディレクトリの作成)
mkdir△mkdir-test
cd△mkdir-test
mkdir△docs
echo△”mkdir△practice△memo”△>△docs/memo.txt
touch△-d△”2026-11-01△10:00″△docs/memo.txt△docs
# 作成したディレクトリの構成を確認する
ls△-lR
実行結果:
.:
total 4
drwxrwxr-x 2 user user 4096 Nov 1 10:00 docs

./docs:
total 4
-rw-rw-r– 1 user user 20 Nov 1 10:00 memo.txt

# ファイルの中身を確認する
cat△docs/memo.txt
実行結果:
mkdir practice memo

以降のコマンドは、すべてmkdir-testの中で実行します
作ったばかりのディレクトリは日時が「実行した日時」になるので、ls△-lで日時が表示される例では、結果をそろえるためにtouch△-dで日時を2026年11月1日10時に固定してから表示しています
エラーメッセージは、引用符の形がロケールによって変わらないように、LC_ALL=Cを付けて英語表示で載せています

-p (–parents)

途中の親ディレクトリが存在しなくても、必要なディレクトリをまとめて作成するオプションです
すでにディレクトリが存在していてもエラーにならないので、シェルスクリプトでもよく使われます

コマンド実行例
# -pなしで、存在しない親ディレクトリの下に作ろうとする
LC_ALL=C△mkdir△src/main/java
実行結果:
mkdir: cannot create directory ‘src/main/java’: No such file or directory
# 親ディレクトリのsrcとsrc/mainがないのでエラーになります

# -pありで作成する
mkdir△-p△src/main/java
find△src
実行結果:
src
src/main
src/main/java
# src、src/main、src/main/javaがまとめて作られました

# もう一度同じコマンドを実行する
mkdir△-p△src/main/java
echo△$?
実行結果:
0
# すでに存在していてもエラーにならず、終了ステータスは0(成功)です

-m (–mode)

作成するディレクトリの権限(パーミッション)を指定するオプションです
chmodと同じく、755のような数字や、u=rwx,g=rx,o=のような記号で指定できます

コマンド実行例
# 自分だけが読み書きできるディレクトリを作る(数字で指定)
mkdir△-m△700△private

# 記号で指定する
mkdir△-m△u=rwx,g=rx,o=△shared

# 権限を確認する(日時を固定してから表示)
touch△-d△”2026-11-01△10:00″△private△shared
ls△-ld△private△shared
実行結果:
drwx—— 2 user user 4096 Nov 1 10:00 private
drwxr-x— 2 user user 4096 Nov 1 10:00 shared
# privateはdrwx——(700)、sharedはdrwxr-x—(750)になっています

# -pと組み合わせた場合
mkdir△-p△-m△700△secret/inner
touch△-d△”2026-11-01△10:00″△secret△secret/inner
ls△-ld△secret△secret/inner
実行結果:
drwxrwxr-x 3 user user 4096 Nov 1 10:00 secret
drwx—— 2 user user 4096 Nov 1 10:00 secret/inner
# -mの権限が付くのは最後のinnerだけで、途中で作られたsecretは通常の権限(775)になります

-v (–verbose)

ディレクトリを作成するたびに、作成したディレクトリ名を表示するオプションです
-pと組み合わせると、どの階層が新しく作られたのかが分かります

コマンド実行例
mkdir△-v△logs
実行結果:
mkdir: created directory ‘logs’

# -pと組み合わせる
mkdir△-pv△data/2026/11
実行結果:
mkdir: created directory ‘data’
mkdir: created directory ‘data/2026’
mkdir: created directory ‘data/2026/11’
# 作られた3つのディレクトリが順番に表示されます

# すでにあるディレクトリは表示されない
mkdir△-pv△data/2026/12
実行結果:
mkdir: created directory ‘data/2026/12’
# dataとdata/2026はすでにあるので、新しく作られたdata/2026/12だけが表示されます

基本的な使い方

mkdirコマンドの基本的な構文は「mkdir△オプション△ディレクトリ名」です
ディレクトリ名をスペースで区切って並べると、複数のディレクトリを一度に作成できます
ディレクトリ名には、相対パス(今いる場所から見た位置)と絶対パス(/から始まる位置)のどちらも使えます

コマンド実行例
# ディレクトリを1つ作成する
mkdir△work
ls△-d△work
実行結果:
work
# mkdirは成功しても何も表示されないので、lsでできたことを確認しています

# 複数のディレクトリを一括で作成する
mkdir△dir1△dir2△dir3
ls△-d△dir*
実行結果:
dir1 dir2 dir3

# 作成したディレクトリの中にディレクトリを作る
mkdir△work/tmp
find△work
実行結果:
work
work/tmp

ブレース展開でまとめて作成する

{ }の中にカンマ区切りで名前を並べると、まとめて複数のディレクトリを作成できます
これはmkdirの機能ではなく、bashなどのシェルの「ブレース展開」という機能です
シェルが先に「project/src△project/docs△project/test」のように展開してから、mkdirに渡しています

ブレース展開の例
# シェルがどう展開するかをechoで確認する
echo△mkdir△-p△project/{src,docs,test}
実行結果:
mkdir -p project/src project/docs project/test

# 実際に作成する
mkdir△-p△project/{src,docs,test}
ls△project
実行結果:
docs src test

# ブレース展開を入れ子にして、階層をまとめて作る
mkdir△-p△app/{bin,conf,logs/{access,error}}
find△app△|△sort
実行結果:
app
app/bin
app/conf
app/logs
app/logs/access
app/logs/error

# {01..03}のように連番で作る
mkdir△-p△month/{01..03}
ls△month
実行結果:
01 02 03
# カンマの後ろにスペースを入れる({src,△docs})と展開されないので注意してください

umaskと作成されるディレクトリの権限

-mを付けずに作ったディレクトリの権限は、777(rwxrwxrwx)からumaskの値を引いたものになります
umaskが0002なら775(drwxrwxr-x)、0022なら755(drwxr-xr-x)です
umaskの値はユーザーやディストリビューションによって違うので、まず自分の環境の値を確認しておきましょう

umaskの例
# 今のumaskを確認する
umask
実行結果:
0002

# umaskが0002のまま作成する
mkdir△mask-0002

# ( )の中だけumaskを0022にして作成する
(umask△0022;△mkdir△mask-0022)
# ( )はサブシェルで実行されるので、今のシェルのumaskは変わりません
umask
実行結果:
0002

# -mで指定するとumaskは関係なくその権限になる
mkdir△-m△777△mask-777

# 権限を比べる(日時を固定してから表示)
touch△-d△”2026-11-01△10:00″△mask-0002△mask-0022△mask-777
ls△-ld△mask-*
実行結果:
drwxrwxr-x 2 user user 4096 Nov 1 10:00 mask-0002
drwxr-xr-x 2 user user 4096 Nov 1 10:00 mask-0022
drwxrwxrwx 2 user user 4096 Nov 1 10:00 mask-777
# mask-0002は775、mask-0022は755、mask-777は777になっています

すでにあるディレクトリにmkdirした場合

すでに存在するディレクトリと同じ名前でmkdirすると、「File exists」というエラーになります
-pを付けた場合はエラーにならず、中のファイルもそのまま残ります

既存のディレクトリの例
# -pなしで既存のdocsを作ろうとする
LC_ALL=C△mkdir△docs
実行結果:
mkdir: cannot create directory ‘docs’: File exists
echo△$?
実行結果:
1
# エラーになり、終了ステータスは1(失敗)です

# -pありの場合
mkdir△-p△docs
echo△$?
実行結果:
0
# エラーにならず、終了ステータスは0(成功)です

# 中のファイルは消えずに残っている
ls△docs
実行結果:
memo.txt

# 同じ名前のファイルがある場合は、-pを付けてもエラーになる
LC_ALL=C△mkdir△-p△docs/memo.txt
実行結果:
mkdir: cannot create directory ‘docs/memo.txt’: File exists
# -pでエラーにならないのは、同じ名前の「ディレクトリ」がある場合だけです

権限のない場所に作ろうとした場合(Permission denied)

ディレクトリを作るには、作る場所(親ディレクトリ)への書き込み権限が必要です
書き込み権限のないディレクトリの下に作ろうとすると、「Permission denied」というエラーになります
ここでは、テスト用ディレクトリの中に書き込みできないディレクトリを作って再現します

権限エラーの例
# 事前準備:書き込みできないディレクトリを作る
mkdir△locked
chmod△555△locked
touch△-d△”2026-11-01△10:00″△locked
ls△-ld△locked
実行結果:
dr-xr-xr-x 2 user user 4096 Nov 1 10:00 locked
# dr-xr-xr-xなので、所有者のuserも書き込みできません

# lockedの下にディレクトリを作ろうとする
LC_ALL=C△mkdir△locked/new
実行結果:
mkdir: cannot create directory ‘locked/new’: Permission denied
LC_ALL=C△mkdir△-p△locked/new/sub
実行結果:
mkdir: cannot create directory ‘locked/new’: Permission denied
# -pを付けても、lockedの下にnewを作る権限がないのでエラーになります

# 自分のディレクトリなので、chmodで書き込み権限を付けると作成できる
chmod△775△locked
mkdir△locked/new
find△locked
実行結果:
locked
locked/new

# 後片付け:練習用のディレクトリを削除する
rm△-r△locked

/etcや/optなど、rootが所有するシステムのディレクトリの下に作る場合も、一般ユーザーではPermission deniedになります
その場合は、本当にそこに作る必要があるかを確認したうえで、sudoを付けて実行します
作る前に「ls△-ld△親ディレクトリ」で、親ディレクトリの所有者と権限を確認するのがおすすめです

日付付きのディレクトリを作る

バックアップやログの保存先として、「backup_20261101」のような日付付きのディレクトリを作ることがよくあります
$( )の中にコマンドを書くと、そのコマンドの結果に置き換わる(コマンド置換)ので、dateコマンドと組み合わせて作ります

日付付きディレクトリの例
# 今日の日付でディレクトリを作る
mkdir△backup_$(date△+%Y%m%d)
# 実行した日の日付で作られるので、結果は省略しています(例えば2026年11月2日ならbackup_20261102になります)

# 日付を指定して作る(date -dはGNU版の書き方)
mkdir△backup_$(date△-d△”2026-11-01″△+%Y%m%d)
ls△-d△backup_*
実行結果:
backup_20261101
# 上の今日の日付の例も実行した場合は、そのディレクトリも一緒に表示されます

# 年/月/日の階層で作る
mkdir△-p△archive/$(date△-d△”2026-11-01″△+%Y/%m/%d)
find△archive
実行結果:
archive
archive/2026
archive/2026/11
archive/2026/11/01

mkdirとcdを組み合わせる

ディレクトリを作ったら、すぐにその中に移動したいことが多いです
「mkdir△-p△ディレクトリ名△&&△cd△ディレクトリ名」と書くと、作成に成功したときだけ移動できます
&&は「前のコマンドが成功したら次のコマンドを実行する」という意味です

mkdirとcdの組み合わせ例
mkdir△-p△newproj/src△&&△cd△newproj/src
pwd
実行結果:
/home/user/mkdir-test/newproj/src
# 作成したディレクトリに移動しています

# 元のディレクトリに戻る
cd△../..

# よく使う場合は関数にしておくと便利
mkcd()△{△mkdir△-p△”$1″△&&△cd△”$1″;△}
mkcd△tools/bin
pwd
実行結果:
/home/user/mkdir-test/tools/bin
cd△../..
# ~/.bashrcに関数を書いておくと、次回ログインしたときからも使えます

mkdirコマンドの実践的な活用例

実際の現場でよく使われるmkdirコマンドの活用例をご紹介します

活用例
# Webアプリ用のディレクトリ構成を、作成内容を表示しながら作る
mkdir△-pv△webapp/{public/{css,js},logs,conf}
実行結果:
mkdir: created directory ‘webapp’
mkdir: created directory ‘webapp/public’
mkdir: created directory ‘webapp/public/css’
mkdir: created directory ‘webapp/public/js’
mkdir: created directory ‘webapp/logs’
mkdir: created directory ‘webapp/conf’

# SSH用のような、自分だけが使うディレクトリを作る
mkdir△-p△-m△700△myhome/.ssh
touch△-d△”2026-11-01△10:00″△myhome/.ssh
ls△-ld△myhome/.ssh
実行結果:
drwx—— 2 user user 4096 Nov 1 10:00 myhome/.ssh
# 実際の~/.sshもこの権限(700)にしておく必要があります

# 事前準備:作りたいディレクトリの一覧ファイルを作る
printf△”site/2026/q1\nsite/2026/q2\nsite/2026/q3\n”△>△dirs.txt
cat△dirs.txt
実行結果:
site/2026/q1
site/2026/q2
site/2026/q3

# 一覧ファイルの内容でまとめて作る
xargs△mkdir△-p△<△dirs.txt
find△site△|△sort
実行結果:
site
site/2026
site/2026/q1
site/2026/q2
site/2026/q3

# スクリプトの中で、出力先のディレクトリを用意してからファイルを書き出す
mkdir△-p△output△&&△echo△”done”△>△output/result.txt
cat△output/result.txt
実行結果:
done
# -pなので、2回目以降に実行してもエラーで止まりません

トラブルシューティング

mkdirコマンドを使うときによくあるつまずきと、その解決方法です

「No such file or directory」エラーが出る

途中の親ディレクトリが存在しないと、このエラーになります
-pを付けて親ディレクトリもまとめて作るか、パスの書き間違いがないか確認しましょう

「File exists」エラーが出る

同じ名前のディレクトリやファイルがすでにあると、このエラーになります
ディレクトリなら-pを付ければエラーになりません
スクリプトで「なければ作る」を明示したいときは、[△-d△ディレクトリ名△]で存在を確認してから作る書き方もあります

存在を確認してから作る例
[△-d△docs△]△&&△echo△”docs△exists”△||△mkdir△docs
実行結果:
docs exists
# docsはすでにあるので、mkdirは実行されずにメッセージが表示されます

スペースを含む名前が2つのディレクトリになる

ディレクトリ名にスペースが入っていると、シェルが別々の名前として扱うので、2つのディレクトリができてしまいます
スペースを含む名前は、”(ダブルクォート)や’(シングルクォート)で囲みましょう

スペースを含む名前の例
# クォートなしで作る
mkdir△my△dir
ls△-d△my△dir
実行結果:
dir my
# myとdirの2つのディレクトリができてしまいました

# 間違えて作った空のディレクトリをrmdirで削除する
rmdir△my△dir

# クォートで囲んで作る
mkdir△”my△dir”
ls△-d△’my△dir’
実行結果:
‘my dir’
# lsは、スペースを含む名前を’で囲んで表示します

ブレース展開が効かない

ブレース展開はbashやzshの機能なので、sh(Ubuntuではdash)で動くスクリプトや、クォートで囲んだ部分では展開されません
{a,b}のような名前のディレクトリが1つできてしまった場合は、シェルの種類やクォートを確認しましょう

ブレース展開が効かない例
# shで実行した場合
sh△-c△’mkdir△-p△shtest/{x,y}’
ls△shtest
実行結果:
{x,y}
# xとyではなく、{x,y}という名前のディレクトリが1つできています

# クォートで囲んだ場合
mkdir△-p△”quoted/{x,y}”
ls△quoted
実行結果:
{x,y}
# クォートの中は展開されないので、こちらも{x,y}という名前になります

まとめ

いかがでしたでしょうか
今回はmkdirコマンドについてまとめてみました
mkdirは「mkdir△ディレクトリ名」でディレクトリを作るシンプルなコマンドですが、-pで親ディレクトリごと作成、-mで権限を指定、-vで作成内容の表示ができます
ブレース展開と組み合わせると、プロジェクトの階層も1行で作れます
作られるディレクトリの権限はumaskで決まること、権限のない場所ではPermission deniedになることも覚えておくと、トラブルのときに慌てずにすみます
ぜひマスターしてください!

スポンサーリンク

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!