ディレクトリが存在しない場合のみ作成する mkdir の使い方 (シェル、スクリプト、ksh)
シェルスクリプトにおいて、ディレクトリが存在しない場合にのみ作成する方法は主に2つあります。
方法1: 条件分岐を用いる
#!/bin/ksh
dir_name="/path/to/directory"
# ディレクトリが存在しない場合
if [ ! -d "$dir_name" ]; then
mkdir "$dir_name"
echo "ディレクトリ $dir_name を作成しました"
else
echo "ディレクトリ $dir_name は既に存在します"
fi
[ ! -d "$dir_name" ]
: ディレクトリ$dir_name
が存在しない場合に真を返す。mkdir "$dir_name"
: ディレクトリを作成する。echo "ディレクトリ $dir_name を作成しました"
: ディレクトリ作成成功時のメッセージ。
方法2: mkdir の -p オプションを用いる
#!/bin/ksh
dir_name="/path/to/directory"
mkdir -p "$dir_name"
mkdir -p "$dir_name"
: ディレクトリとその親ディレクトリが存在しない場合に再帰的に作成する。
どちらの方法を選ぶか
- 条件分岐を用いる方法は、ディレクトリが存在する場合の処理を追加できるため、柔軟性が高い。
- mkdir の -p オプションを用いる方法は、シンプルで簡潔である。
注意事項
- ディレクトリ名の変数
dir_name
には絶対パスまたは相対パスを指定する。 - シェルスクリプトの実行権限を付与する必要がある (
chmod +x script.sh
など)。
-d
オプションは、指定されたファイルがディレクトリであるかどうかをチェックする。!
演算子は否定を表す。mkdir
コマンドは、ディレクトリを作成する。-p
オプションは、親ディレクトリも必要に応じて作成する。
これらの方法を理解することで、シェルスクリプトにおいてディレクトリの作成を適切に制御することができます。
ディレクトリが存在しない場合にのみ作成する: より詳細な解説と応用
コード例の詳細な解説
#!/bin/ksh
dir_name="/path/to/directory"
# ディレクトリが存在しない場合
if [ ! -d "$dir_name" ]; then
mkdir "$dir_name"
echo "ディレクトリ $dir_name を作成しました"
else
echo "ディレクトリ $dir_name は既に存在します"
fi
[ ! -d "$dir_name" ]
:[
と]
で囲まれた部分はテストコマンドです。!
は否定を意味します。"$dir_name"
は、作成または確認したいディレクトリのパスです。- この行全体で、「$dir_name がディレクトリでない」という条件を判定しています。
mkdir "$dir_name"
:"$dir_name"
には、作成するディレクトリのパスが指定されます。
echo "ディレクトリ $dir_name を作成しました"
:echo
コマンドは、文字列を出力します。- 成功メッセージとして、作成したディレクトリ名を標準出力に表示します。
else
:
#!/bin/ksh
dir_name="/path/to/directory"
mkdir -p "$dir_name"
mkdir -p "$dir_name"
:-p
オプションは、指定されたディレクトリまでのパスに存在しないディレクトリを全て作成します。- 例えば、
"/path/to/directory"
が存在しない場合、"/path"
と"/path/to"
も作成されます。
応用と注意点
- エラー処理:
- パーミッション:
- 複数のディレクトリ:
- ディレクトリ名の生成:
- シェルスクリプトの記述:
- シェルスクリプトは、特定のタスクを自動化するために記述されるプログラムです。
- 適切なコメントを追加することで、コードの可読性を高めることができます。
ディレクトリ作成の条件分岐と -p オプションの比較
特徴 | 条件分岐を用いる方法 | mkdir -p オプションを用いる方法 |
---|---|---|
柔軟性 | 高い (条件分岐を追加できる) | 低い |
簡潔さ | 低い | 高い |
親ディレクトリの作成 | 手動で行う必要がある | 自動で行う |
ディレクトリが存在しない場合にのみ作成する方法は、シェルスクリプトでよく利用されるテクニックです。状況に応じて、条件分岐を用いる方法と mkdir -p
オプションを用いる方法を使い分けることで、効率的なスクリプトを作成することができます。
man mkdir
(mkdir コマンドのマニュアル)man test
(test コマンドのマニュアル)
- 特定の条件下でのディレクトリ作成:
- エラー処理の強化:
- ログの出力:
find コマンドを用いた方法
find
コマンドは、ファイルシステムを検索するための強力なツールです。ディレクトリが存在するかどうかの確認に利用できます。
#!/bin/ksh
dir_name="/path/to/directory"
# ディレクトリが存在しない場合
if ! find "$dir_name" -maxdepth 0 -type d -print -quit; then
mkdir "$dir_name"
echo "ディレクトリ $dir_name を作成しました"
else
echo "ディレクトリ $dir_name は既に存在します"
fi
find "$dir_name" -maxdepth 0 -type d -print -quit
:"$dir_name"
: 検索を開始するディレクトリ-maxdepth 0
: 検索深度を0に設定し、指定したディレクトリのみを検索-type d
: ディレクトリのみを検索-print
: 検索結果を表示-quit
: 最初のヒットで検索を終了
この方法は、より柔軟な検索条件を指定できるという利点があります。
test
コマンドは、条件式を評価するコマンドです。[ ]
と同じように使用できます。
#!/bin/ksh
dir_name="/path/to/directory"
# ディレクトリが存在しない場合
if test ! -d "$dir_name"; then
mkdir "$dir_name"
echo "ディレクトリ $dir_name を作成しました"
else
echo "ディレクトリ $dir_name は既に存在します"
fi
この方法は、[ ]
とほぼ同じですが、より厳密な評価を行うことができます。
&& と || を用いた方法
&&
と ||
は、コマンドの連結に使用します。&&
は前のコマンドが成功した場合にのみ次のコマンドを実行し、||
は前のコマンドが失敗した場合にのみ次のコマンドを実行します。
#!/bin/ksh
dir_name="/path/to/directory"
[ ! -d "$dir_name" ] && mkdir "$dir_name" || echo "ディレクトリ $dir_name は既に存在します"
この方法は、一行で簡潔に記述できるという利点があります。
- ディレクトリ名の生成:
date
コマンドや変数を利用して、動的にディレクトリ名を作成できます。 - エラー処理:
trap
コマンドやset -e
オプションを利用して、エラーが発生した場合に適切な処理を行うことができます。 - パーミッションの変更:
chmod
コマンドを利用して、作成したディレクトリのパーミッションを変更できます。
どの方法を選ぶべきか
- シンプルさ:
mkdir -p
が最もシンプルです。 - 柔軟性:
find
コマンドを用いた方法が最も柔軟です。 - 簡潔さ:
&&
と||
を用いた方法が最も簡潔です。
状況に応じて適切な方法を選択してください。
ディレクトリが存在しない場合にのみ作成する方法は、シェルスクリプトでよく利用される基本的なテクニックです。様々な方法がありますが、状況に応じて最適な方法を選択することで、より効率的で堅牢なスクリプトを作成することができます。
追加で知りたいこと:
- 特定の条件下でのディレクトリ作成
- エラー処理の強化
- ログの出力
- 複数のシェルでの動作の違い
- より高度なファイルシステム操作
shell scripting ksh