ファイルが存在するかどうかテストする

testコマンドの-eオプションで引数に渡したファイル名のファイルが存在するかをテストできる。

test -e filename

このときGlobパターンを渡すことはできず、test -e filename*とすると、先にGlobパターンが展開されるため、

マッチするファイルの数 結果
0 失敗
1 成功
>=2 失敗: too many arguments

となる。0 件のとき zsh では no matches found で止まり、Bash では glob が展開されず filename* という名前の存在確認になり失敗する。test -e "filename*"とすると、filename*という名前のファイルが存在するかをテストするためGlobパターンとして認識されない。

Bashならcompgenコマンドが使用できる

Bashならcompgenコマンドが使用できる。-GオプションとGlobパターンを渡すと、マッチするファイル名をすべて返す(標準出力に列挙する)。存在確認だけなら出力を捨てて終了ステータスを見ればよい。

compgen -G "filename*" > /dev/null

シェルを問わないならfindコマンドが使用できる

findコマンドでも同様のことが行える。-nameオプションはGlobパターンを渡すことができ、-quitオプションは1つでも見つかったときに終了するため無駄に探索しなくて済む。

test -n "$(find . -maxdepth 1 -name 'filename*' -print -quit)"