Bashでのファイルの存在チェック方法
作成: 2021-02-21
更新: 2021-02-21
bash
ファイルの有無を判定する方法をよく忘れるので、整理してみることにしました。
書いたとしても、また忘れると思うのですが・・・。
bash
でファイルやディレクトリがあるかどうかを判定する時は、以下のようなif
文を使います。
if [ -f /path/to/file ]; then
# ファイルがあるとき
else
# ファイルがないとき
fi
# ちなみにファイルが無いときだけ処理を書きたければ以下
if [ ! -f /path/to/file ]; then
# ファイルがないとき
fi
この時の-f
の部分がいつも思い出せなくなります。
結論から言うと以下です。
オプション | 説明 |
---|---|
-e | パスの存在をチェックする |
-f | ファイルの存在をチェックする |
-d | ディレクトリの存在をチェックする |
確認してみる
以下のようなcheck.sh
というスクリプトを書いて、-e
、-f
、-d
をそれぞれ、ディレクトリとファイルに対して実行した場合にどうなるかを確認しました。
foo
というディレクトリとhoge.txt
というファイルを用意して、これの存在チェックをやっています。
#!/bin/bash
echo '-----------------'
echo 'e:'
echo ' 対象がファイルの場合(hoge.txt):'
if [ -e ./hoge.txt ]; then
echo ' Found'
else
echo ' Not found'
fi
echo ' 対象がディレクトリの場合(foo):'
if [ -e ./foo ]; then
echo ' Found'
else
echo ' Not found'
fi
echo
echo
echo 'f:'
echo ' 対象がファイルの場合(hoge.txt):'
if [ -f ./hoge.txt ]; then
echo ' Found'
else
echo ' Not found'
fi
echo ' 対象がディレクトリの場合(foo):'
if [ -f ./foo ]; then
echo ' Found'
else
echo ' Not found'
fi
echo
echo
echo 'd:'
echo ' 対象がファイルの場合(hoge.txt):'
if [ -d ./hoge.txt ]; then
echo ' Found'
else
echo ' Not found'
fi
echo ' 対象がディレクトリの場合(foo):'
if [ -d ./foo ]; then
echo ' Found'
else
echo ' Not found'
fi
echo '-----------------'
スクリプトと対象のファイル・ディレクトリは同じ階層においておきます。
[vagrant@vagrant tmp]$ ls -l
total 4
-rwxrwxr-x 1 vagrant vagrant 872 Feb 21 14:57 check.sh
drwxrwxr-x 2 vagrant vagrant 6 Feb 21 14:16 foo
-rw-rw-r-- 1 vagrant vagrant 0 Feb 21 14:16 hoge.txt
./check.sh
を実行すると以下のような結果になります。
[vagrant@vagrant tmp]$ ./check.sh
-----------------
e:
対象がファイルの場合(hoge.txt):
Found
対象がディレクトリの場合(foo):
Found
f:
対象がファイルの場合(hoge.txt):
Found
対象がディレクトリの場合(foo):
Not found
d:
対象がファイルの場合(hoge.txt):
Not found
対象がディレクトリの場合(foo):
Found
-----------------
-e
はディレクトリとファイルの両方を見つけられています。
-f
はファイルのみ、-d
はディレクトリのみ見つけられていることがわかりました。
まとめ
bash
でのファイルの存在チェック方法を再確認しました。
とりあえずファイルかディレクトリがあるかが知りたいときは、-e
を使えばよいことがわかりました。例えばロックファイルのようなものがあるか調べて処理を制御したいときなど。
設定ファイルを読み込みたいときなど、後の処理で探したファイルやディレクトリの中身がを使いたい場合は、-f
や-d
を使うのがよさそうです。
ファイルだと思って開いたらディレクトリだったということを減らせそうです。