mkdirコマンドの使い方:ディレクトリ作成の基本と実務での活用法

概要

mkdir(Make Directory)コマンドは、新しいディレクトリを作成するための基本コマンドです。

現場での重要性: アプリケーションのデプロイ、ログ保存ディレクトリの準備、バックアップ先の作成など、あらゆる運用作業で必須です。適切なオプションを知らないと、深い階層のディレクトリ作成に手間取ったり、権限設定を後から修正する無駄な作業が発生します。逆に、mkdirの高度な使い方を習得することで、環境構築やスクリプト作成の効率が飛躍的に向上します。


基本コマンド・構文

最も基本的な使い方

mkdir directory_name

実行例:

$ mkdir myproject
$ ls -ld myproject
drwxr-xr-x 2 user user 4096 Jan 29 10:30 myproject

現在のディレクトリにmyprojectという名前のディレクトリが作成されます。

複数のディレクトリを一度に作成

mkdir dir1 dir2 dir3

実行例:

$ mkdir logs backups configs
$ ls -ld logs backups configs
drwxr-xr-x 2 user user 4096 Jan 29 10:31 backups
drwxr-xr-x 2 user user 4096 Jan 29 10:31 configs
drwxr-xr-x 2 user user 4096 Jan 29 10:31 logs

現場で必須のオプション・設定

1. mkdir -p:親ディレクトリを含めて再帰的に作成

mkdir -p /path/to/deep/directory

実行例:

$ mkdir -p /var/www/myapp/storage/logs
$ ls -ld /var/www/myapp/storage/logs
drwxr-xr-x 2 user user 4096 Jan 29 10:35 /var/www/myapp/storage/logs

実務での活用理由: アプリケーションのデプロイ時に、深い階層のディレクトリ構造を一度に作成できます。親ディレクトリが存在しない場合でもエラーにならず、必要な階層をすべて自動作成するため、スクリプトやCI/CDパイプラインで多用されます。また、-pオプションは既にディレクトリが存在する場合もエラーを出さないため、冪等性を保つ必要がある運用スクリプトでは必須です。

2. mkdir -m:作成時に権限を指定

mkdir -m 755 public_dir

実行例:

$ mkdir -m 755 public_html
$ ls -ld public_html
drwxr-xr-x 2 user user 4096 Jan 29 10:40 public_html

$ mkdir -m 700 private_data
$ ls -ld private_data
drwx------ 2 user user 4096 Jan 29 10:41 private_data

実務での活用理由: Webサーバーの公開ディレクトリ(755)やデータベースの機密情報を格納するディレクトリ(700)など、セキュリティ要件に応じた権限を作成時に設定できます。後からchmodで変更する手間が省け、権限設定の漏れを防ぎます。

3. mkdir -pmkdir -m の組み合わせ

mkdir -p -m 750 /opt/app/data

実行例:

$ mkdir -p -m 750 /opt/myapp/secure/data
$ ls -ld /opt/myapp/secure/data
drwxr-x--- 2 user user 4096 Jan 29 10:45 /opt/myapp/secure/data

実務での活用理由: 深い階層のディレクトリを作成しつつ、最終的なディレクトリに適切な権限を設定できます。ただし、-mオプションは最後のディレクトリにのみ適用されるため、親ディレクトリの権限は別途設定が必要です。

4. mkdir -v:作成したディレクトリを表示(冗長モード)

mkdir -v directory_name

実行例:

$ mkdir -v logs backups
mkdir: created directory 'logs'
mkdir: created directory 'backups'

実務での活用理由: スクリプトのデバッグ時やログ出力で、どのディレクトリが作成されたかを明示的に確認できます。自動化処理の動作確認に有効です。

5. mkdirumask の関係

umaskの設定により、デフォルトのディレクトリ権限が変わります。

$ umask
0022

$ mkdir test_dir
$ ls -ld test_dir
drwxr-xr-x 2 user user 4096 Jan 29 10:50 test_dir

実務での活用理由: umask 0022の場合、ディレクトリのデフォルト権限は755になります。セキュリティポリシーに応じてumaskを変更することで、作成されるディレクトリの権限を統一できます。


実践的なユースケース(逆引きレシピ)

ケース1:アプリケーションのディレクトリ構造を一括作成

Webアプリケーションの標準的なディレクトリ構造を作成:

mkdir -p myapp/{src,config,logs,backups,tmp}

実行例:

$ mkdir -p myapp/{src,config,logs,backups,tmp}
$ tree myapp
myapp
├── backups
├── config
├── logs
├── src
└── tmp

ブレース展開を使うことで、複数のサブディレクトリを一度に作成できます。

ケース2:日付ベースのバックアップディレクトリを作成

日付ごとにバックアップディレクトリを作成:

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

実行例:

$ mkdir -p /backups/$(date +%Y%m%d)
$ ls -ld /backups/20260129
drwxr-xr-x 2 user user 4096 Jan 29 11:00 /backups/20260129

スクリプトに組み込むことで、毎日自動的に日付付きバックアップディレクトリを作成できます。

ケース3:ユーザーごとのホームディレクトリを一括作成

複数のユーザー用ディレクトリを権限付きで作成:

for user in alice bob charlie; do
  mkdir -p -m 700 /home/$user
  chown $user:$user /home/$user
done

実行例:

$ for user in alice bob charlie; do
>   mkdir -p -m 700 /home/$user
>   chown $user:$user /home/$user
> done

$ ls -ld /home/alice /home/bob /home/charlie
drwx------ 2 alice alice 4096 Jan 29 11:05 /home/alice
drwx------ 2 bob   bob   4096 Jan 29 11:05 /home/bob
drwx------ 2 charlie charlie 4096 Jan 29 11:05 /home/charlie

ケース4:既存ディレクトリの有無を確認してから作成

スクリプト内で安全にディレクトリを作成:

if [ ! -d /var/log/myapp ]; then
  mkdir -p /var/log/myapp
  echo "ディレクトリを作成しました"
else
  echo "ディレクトリは既に存在します"
fi

-pオプションを使えば条件分岐不要ですが、明示的にログ出力したい場合に有効です。

ケース5:深い階層のテスト用ディレクトリを作成

パフォーマンステストや動作確認用に深い階層を作成:

mkdir -p test/level1/level2/level3/level4/level5

実行例:

$ mkdir -p test/level1/level2/level3/level4/level5
$ find test -type d
test
test/level1
test/level1/level2
test/level1/level2/level3
test/level1/level2/level3/level4
test/level1/level2/level3/level4/level5

シニアエンジニアの知恵(Expert Advice)

1. mkdir -p の冪等性を活用する

スクリプトでmkdir -pを使うと、既にディレクトリが存在してもエラーにならず、何度実行しても同じ結果になります。これにより、Ansibleやシェルスクリプトでの冪等性が保証されます。

mkdir -p /var/log/myapp  # 既に存在していてもエラーにならない

2. 権限設定は作成時に行う

mkdirchmodを別々に実行するのではなく、-mオプションで作成時に権限を設定することで、権限設定の漏れや一時的な脆弱性を防ぎます

# 悪い例
mkdir /tmp/sensitive
chmod 700 /tmp/sensitive  # 一瞬だけ他のユーザーがアクセス可能

# 良い例
mkdir -m 700 /tmp/sensitive  # 作成と同時に権限設定

3. ディレクトリ名にスペースを含む場合の注意

ディレクトリ名にスペースが含まれる場合、必ずダブルクォートで囲んでください。

mkdir "My Documents"
# または
mkdir My\ Documents

クォートなしで実行すると、意図しない複数のディレクトリが作成されます。

4. 親ディレクトリの権限は別途設定が必要

mkdir -p -m 700 /a/b/cとした場合、700の権限が適用されるのは最後のディレクトリcのみです。親ディレクトリabumaskに従った権限になります。

$ mkdir -p -m 700 /test/parent/child
$ ls -ld /test /test/parent /test/child
drwxr-xr-x 3 user user 4096 Jan 29 11:20 /test
drwxr-xr-x 3 user user 4096 Jan 29 11:20 /test/parent
drwx------ 2 user user 4096 Jan 29 11:20 /test/parent/child

すべてのディレクトリに同じ権限を設定する場合は、chmod -Rで後から変更してください。

5. mkdir の実行権限を確認する

ディレクトリを作成するには、親ディレクトリに対する書き込み権限と実行権限が必要です。

$ ls -ld /restricted
drwxr-xr-x 2 root root 4096 Jan 29 11:25 /restricted

$ mkdir /restricted/newdir
mkdir: cannot create directory '/restricted/newdir': Permission denied

sudoを使うか、親ディレクトリの所有者に依頼してください。

6. ディレクトリ作成の失敗をハンドリングする

スクリプト内では、mkdirの失敗を適切に処理してください。

mkdir -p /critical/path || { echo "ディレクトリ作成に失敗しました"; exit 1; }

または、set -eでスクリプト全体をエラー時に停止させる設定を推奨します。

7. install コマンドの活用

ディレクトリ作成と同時に所有者やグループを設定したい場合、installコマンドも検討してください。

install -d -m 755 -o www-data -g www-data /var/www/html/app

mkdirchownを別々に実行するよりも効率的です。