現在 /home/user ディレクトリにいます。/home/user/projects も /home/user/projects/app もまだ存在しません。次のコマンドのうち、エラーなく /home/user/projects/app/src ディレクトリを作成できるのはどれですか?
解説
mkdir は指定したディレクトリを作成するコマンドですが、デフォルトでは親ディレクトリが存在しないとエラーになります。今回は projects も app も存在しないため、素の mkdir projects/app/src は「No such file or directory」で失敗します。-p(--parents)オプションを付けると、パス上に存在しない親ディレクトリをすべて自動的に作成してくれるため、一発で深い階層を掘れます。選択肢Cの -r は mkdir には存在しないオプションです(rm -r の再帰削除と混同しやすいので注意)。選択肢Dの --force も mkdir にはありません(こちらは rm -f や cp -f との混同です)。mkdir -p がエラーにならないもう一つの特徴-p にはもう一つ重要な性質があります。指定したディレクトリがすでに存在していてもエラーにならないという点です。素の mkdir は既存ディレクトリに対して「File exists」エラーを返しますが、-p 付きなら何事もなく正常終了します。# 素の mkdir は既存ディレクトリでエラー $ mkdir projects $ mkdir projects mkdir: cannot create directory 'projects': File exists # -p なら既に存在していても正常終了 $ mkdir -p projects $ echo $? 0この性質があるため、シェルスクリプトや Makefile で「あるかどうかわからないけど、なければ作りたい」という場面では、存在確認の if 文を書かずに mkdir -p だけで済みます。実務でよく見る mkdir -p の使いどころプロジェクトのセットアップスクリプトや CI/CD パイプラインでは、ビルド成果物の出力先やログディレクトリを事前に用意する場面が頻出します。# よくあるパターン: ビルド前にディレクトリ構造を一括作成 mkdir -p dist/assets/images mkdir -p logs/app logs/nginx上の例のように、スペース区切りで複数パスを一度に渡せる点も覚えておくと便利です。また、Dockerfile の RUN 命令や Makefile のターゲット内でも、冪等性(何度実行しても同じ結果になること)を担保するために mkdir -p は定番の書き方です。逆に言えば、-p を付けない素の mkdir を使う場面は「ディレクトリが既に存在していたらそれ自体が異常なのでエラーにしたい」というケースに限られます。日常的なディレクトリ作成では -p を付ける習慣にしておくのが実用的です。