Globパターンにマッチするファイルがあるかテストする
ファイルが存在するかどうかテストする
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)"