【シェルスクリプト】ファイルやディレクトリの有無を確認する方法色々

シェルスクリプトでファイルやディレクトリが存在しているかどうかを確認する方法です。

確認には「if」文を使っています。

ファイルが存在する場合

if文の演算子で「-e」を使うことでファイルが存在しているかどうかを確認することが出来ます。

if [ -e ファイル ]; then
  実行するコマンド
fi

「test.txt」というファイルが存在するかどうかを確認し、ファイルが存在する場合「File exists.」と表示させるスクリプトを作成しました。

#!/bin/bash

FILE="test.txt"

if [ -e $FILE ]; then
  echo "File exists."
fi

動作検証用に「test.txt」ファイルを作成します。

$ touch test.txt

「check_file_1.sh」を実行すると「test.txt」は存在するので「File exists.」と表示されることが確認できました。

$ sh check_file_1.sh
File exists.

ファイルが存在しない場合

ファイルが存在していないことを確認させる場合は、演算子に「!」を付けることで結果を反転させることが出来ます。

ですので「! -e」とすることで、ファイルが存在しない場合に「真」となり、コマンドを実行させることが出来ます。

if [ ! -e ファイル ]; then
  実行するコマンド
fi

下記は「test.txt」ファイルが存在しない場合に「File not exists.」と表示させるスクリプトです。

#!/bin/bash

FILE="test.txt"

if [ ! -e $FILE ];then
  echo "File not exists."
fi

先ほど作成した「test.txt」ファイルを削除してからスクリプトを実行させてみます。

$ rm test.txt

「test.txt」ファイルは存在していないため「File not exists.」と表示されます。

$ sh check_file_2.sh
File not exists.

ディレクトリが存在する場合

ディレクトリがあるかどうかを確認する場合は、演算子に「-d」を使用します。

if [ -d ディレクトリ ]; then
  実行するコマンド
fi

下記は「test」というディレクトリがあった場合は「Directory exists.」と表示されるスクリプトになります。

#!/bin/bash

DIR="test"

if [ -d $DIR ];then
  echo "Directory exists."
fi

「test」ディレクトリを作成してからスクリプトを実行してみます。

$ mkdir test
$ ls -l | grep test
drwxrwxr-x 2 tamohiko tamohiko 4096 Jun 20 17:41 test

「test」ディレクトリが存在するので「Directory exists.」と表示されました。

$ sh check_dir_1.sh
Directory exists.

ディレクトリが存在しない場合

ディレクトリが存在していないことを確認させる場合は、演算子に「!」を付けることで結果を反転させることが出来ます。

if [ ! -d ディレクトリ ]; then
  実行するコマンド
fi

「test」ディレクトリが存在しない場合に「Directory not exists.」と表示するスクリプトになります。

#!/bin/bash

DIR="test"

if [ ! -d $DIR ];then
  echo "Directory not exists."
fi

先ほど作成した「test」ディレクトリを削除してスクリプトを実行してみます。

$ rm -R test/

「test」ディレクトリが無いため「Directory not exists.」と表示されます。

$ sh check_dir_2.sh
Directory not exists.

その他の演算子

ファイルやディレクトリの存在を確認する際に使用できる演算子についてまとめました。

演算子 説明
-a ファイル ファイルがあれば真
-b ファイル ファイルがありブロックス特殊ファイルであれば真
-c ファイル ファイルがありキャラクター特殊ファイルであれば真
-d ファイル ファイルがありディレクトリであれば真
-e ファイル ファイルがあれば真
-f ファイル ファイルがあり通常のファイルであれば真
-g ファイル ファイルがありSGID(特殊なアクセス権)であれば真
-G ファイル ファイルがあり実行グループIDによる所有者であれば真
-h ファイル ファイルがありシンボリックであれば真(-Lと同じ)
-k ファイル ファイルがありステッキービットが設定されていれば真
-L ファイル ファイルがありシンボリックであれば真(-hと同じ)
-O ファイル ファイルがあり実行ユーザIDによる所有者であれば真
-p ファイル ファイルがあり名前付きパイプ(named pipe)であれば真
-r ファイル ファイルがあり読み取り可能であれば真
-s ファイル ファイルがありサイズが0より大きければ真
-S ファイル ファイルがありソケットであれば真
-t FD FD(ファイルディスクリプタ)が端末でオープンされていれば真
-u ファイル ファイルがありSUID(特殊なアクセス権)であれば真
-w ファイル ファイルがあり書き込み可能であれば真
-x ファイル ファイルがあり実行可能であれば真

シェアする