NnmnLog

Bashでのファイルの存在チェック方法

作成: 2021-02-21
更新: 2021-02-21
タグ: Bash Shell Script

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を使うのがよさそうです。

ファイルだと思って開いたらディレクトリだったということを減らせそうです。