“mkdir”コマンドでディレクトリを作成する際には存在チェックはしなくても良い

Bash

はじめに

シェルスクリプトでディレクトリを作成し、 cd コマンドで移動する、というようなロジックを書くことがあります。

mkdir コマンドを単純に実行してしまうと、すでにディレクトリが存在しているときにエラーを吐いてしまうため、ディレクトリ存在チェックを行う必要がありますが面倒です。

これは簡単に解決することができます。

検証環境

$ uname -moi
x86_64 x86_64 GNU/Linux
$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

ディレクトリの存在チェックロジックを実装する方法

よく記述していたのは以下のようなコードでした。
事前にディレクトリの存在チェックを行い、見つからなかった場合のみディレクトリを作成します。

[ ! -d "/tmp/of/work" ] && mkdir -p "/tmp/work"
cd "/tmp/of/work"

mkdir -p コマンドを使ってディレクトリを作成する場合は存在チェックは不要

実はディレクトリの存在チェックを行わなくても先のスクリプトは問題なく動作します。
mkdir -p コマンドは以下のような挙動をします。

  1. 作成対象ディレクトリの親ディレクトリが存在しない場合 はすべての親ディレクトリを作成する
  2. 作成対象ディレクトリがすでに存在している場合 は何も行わず、エラーもはかない

試してみます。

# 一旦ディレクトリを作成
$ mkdir -p /tmp/of/work
$ ls -l -d /tmp/of/work/
drwxr-xr-x 2 root root 64 Aug 22 08:26 /tmp/of/work/
# オプション無しですでに存在しているディレクトリを作成
$ mkdir /tmp/of/work
mkdir: cannot create directory '/tmp/of/work': File exists
$ echo $?
1
# -pオプション有りだとエラーを吐かない
$ mkdir -p /tmp/of/work
$ echo $?
0

したがって、先のスクリプトは以下のようにかけます。

mkdir -p "/tmp/work"
cd "/tmp/of/work"

ひとこと

mkdir はよく使うコマンドですので、便利な使い方を把握しておくと長い目で見たときに効率化に大きく貢献するはずです。

Bash

Posted by genzouw