概要
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 -p と mkdir -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. mkdir と umask の関係
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. 権限設定は作成時に行う
mkdirとchmodを別々に実行するのではなく、-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のみです。親ディレクトリaやbはumaskに従った権限になります。
$ 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 deniedsudoを使うか、親ディレクトリの所有者に依頼してください。
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/appmkdirとchownを別々に実行するよりも効率的です。
