はじめに
単一ファイルの存在確認であれば、[ -e file ]
で確認が出来ますが、この構文ではワイルドカードが使えず、ほかの方法を模索したのでメモ。
lsのエラーをつかむ方法
ググったときによく出てきたのは、下記のようにls
叩いてエラーを拾う方法。一致するものが無い場合にエラー終了(終了ステータス2)することを利用して、判定をしています。
ls /hoge/*.txt >/dev/null 2>&1
if [ $? -ne 0 ]; then
# 存在しない場合
else
# 存在する場合
fi
その他のエラーと分離したい
上の方法で困るのは、エラー終了のときに、まるっとすべて存在しない扱いになってしまうこと。「/bin/ls
削除してシェル叩きまっせ」とかいう変態テストでNGになってしまったため、急遽別の方法を模索することに。
そこで採用したのが下記の方法。find
の-name
オプションを使用してあげれば、ファイルが存在しないときには正常終了・標準出力なしになるため、エラーと分離が出来ます。(ただし、捜索先のディレクトリは存在していないとエラーになります。これは[ -e dir ]
とかで確認できるし問題ないかな)
RES=`find /hoge -maxdepth 1 -name *.txt 2>/dev/null`
if [ $? -ne 0 ]; then
# 予期せぬエラーの場合
elif [ -z "$RES" ]; then
# 存在しない場合
else
# 存在する場合
fi