Linux / コマンド / mkdir - ディレクトリ作成

mkdirは新しいディレクトリを作成するコマンドです。-pを使用すると、存在しない上位ディレクトリも一緒に作ることができ、プロジェクト構造の作成やデプロイスクリプトに特に便利です。

umask は、新しく作るファイルやディレクトリから差し引く権限を指定する設定です。以下では自分が所有する空の練習用ディレクトリを使い、/srv/myapp などの例は書き込める場所に置き換えてください。この記事では、基本的な文法、複数ディレクトリの作成、権限の指定、umaskとの関係、既に存在するパスの扱い方をGNU Coreutils基準で説明します。

mkdirコマンドとは?

mkdirは指定した名前でディレクトリを作成します。基本的に上位パスがなかったり、同じ名前の項目が既にある場合は失敗します。-pを使用すると、必要な親ディレクトリを作成し、既に存在するディレクトリはエラーとして扱いません。

基本的な文法

mkdir [オプション] ディレクトリ ...

ファイル名やパスに空白がある場合は引用符で囲み、ハイフンで始まる名前は可能であれば--の後に指定します。サポートされるオプションはディストリビューションとGNU Coreutilsのバージョンによって異なる場合があるため、mkdir --helpとman mkdirで現在のシステムの説明を確認してください。

mkdirの基本的な使い方

ディレクトリを一つ作る

現在の位置にディレクトリを作ることも、絶対・相対パスを指定することもできます。

mkdir logs
mkdir /srv/myapp

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

各パスは独立した引数です。空白が含まれる名前は引用符で囲みます。

mkdir src tests docs
mkdir 'project files'

上位ディレクトリまで一緒に作成する

-pは中間パスがない場合に一緒に作成します。同じディレクトリがすでに存在しても続行するため、繰り返し実行する初期化スクリプトに適しています。

mkdir -p project/src/components
mkdir -p /srv/myapp/{bin,config,logs}

{bin,config,logs} はBashのブレース展開で複数の引数になる記法です。mkdir 自体の機能ではなく、POSIXシェルでは同じ展開が行われるとは限りません。

作成されたパスを確認する

mkdirも正常に完了した場合は通常出力はありません。-pは存在しない親パスも一緒に作成します。

mkdir -p demo-dir/logs
find demo-dir -type d

例の出力:

demo-dir
demo-dir/logs

ディレクトリが作成されても、権限が期待通りであるとは限りません。stat -c '%a %n' demo-dir demo-dir/logsで実際の権限を確認してください。

主なオプション

オプション 説明
-p, --parents 欠落した上位ディレクトリを作成し、既存のディレクトリをエラーとして扱いません。
-m MODE 新しく指定した最終ディレクトリの権限モードを設定します。
-v, --verbose 作成した各ディレクトリを出力します。
-Z SELinux(強制アクセス制御の仕組み)が有効な環境で、作成場所のポリシーに基づく既定のセキュリティラベルを適用します。
--context=CONTEXT サポートされている環境で、新しいディレクトリに指定したセキュリティコンテキストを設定します。

長いオプションは意味を把握しやすく、スクリプトの確認にも役立ちます。ただし、移植性が重要なスクリプトでは対象システムがその GNU 拡張オプションをサポートしているかをまず確認してください。

実践的活用例

権限を指定してディレクトリを作成する

-mにはchmodのような数字または記号のモードを使用できます。実際のポリシーと親ディレクトリの権限も確認してください。

mkdir -m 750 private-data
mkdir -m u=rwx,go= project-secret

親ディレクトリの権限を制御する

mkdir -p -m 750 a/b/cの-mはコマンドラインで指定した最終ディレクトリに適用され、新しく作成された親ディレクトリすべてに同じモードを保証するものではありません。既に存在するディレクトリの権限も -p では変わりません。親まで制御するには、制限された umask で作成した後、必要な権限を明示的に確認してください。次の app は、まだ存在しない練習用ディレクトリ名です。2行目は配下の既存ディレクトリも含めて権限を変更するため、既存のアプリケーション領域には実行しないでください。

( umask 027; mkdir -p app/cache/data )
find app -type d -exec chmod 750 {} +

作成結果を確認する

自動化では終了状態を確認し、権限と所有権が重要なパスはstatコマンドまたは namei で検証します。

mkdir -pv deploy/releases/current
stat -c '%A %U:%G %n' deploy deploy/releases deploy/releases/current

mkdirと関連コマンドの比較

コマンド・方法 主な役割 適した状況
mkdir 一般ディレクトリの作成 作業空間とディレクトリツリーを作るとき
install -d ディレクトリ作成と権限・所有者の設定 インストール・配布過程で属性まで指定するとき
rmdir 空のディレクトリの削除 内容がないディレクトリだけを安全に削除するとき
mktemp -d 予測が難しい一時ディレクトリの作成 スクリプト用一時作業スペースが必要なとき

使用する際の注意点

-pはタイプミスでもディレクトリにする

長いパスでスペルを間違えても必要な親ディレクトリと見なしてそのまま作成できます。重要なシステムパスは、変数の値と最終パスを確認してから作成してください。

権限はumaskの影響を受ける

-mを使わない場合の基本権限は、現在のumaskに従って制限されます。共同作業サーバーでは、予想される権限を数値で断定せず、実際の値を確認してください。

作成権限とアクセス権限は異なる

上位ディレクトリに書き込み・実行権限がなければ、下位ディレクトリを作成できません。単に対象パスの権限だけでなく、全体のパスを確認する必要があります。

FAQ

上位ディレクトリがなくても一度に作れますか?

mkdir -p 上位/下位/対象を使うと、欠けている中間ディレクトリも一緒に作成されます。

既に存在するディレクトリでエラーが出ないようにするにはどうすればよいですか?

-pを使用します。ただし、同じパスに通常のファイルがあると失敗します。

mkdir -mの権限は親ディレクトリにも適用されますか?

通常、-pが新しく作った親ディレクトリ全てに同じように適用されるわけではありません。親の権限はumaskか別のchmodで管理してください。

一時ディレクトリもmkdirで作れますか?

固定された名前が必要な通常のディレクトリであれば問題ありませんが、共有の一時領域で安全な固有名が必要な場合はmktemp -dが適しています。

参考資料