findコマンドでアスタリスクを使うときに引用符でくくらないといけない理由

最近 find コマンドを使う機会がめっきり減りました。多分VSCodeで作業することが多くなったからだと思いますが、ビルドスクリプトをシコシコ書いているときなどにはやっぱりfindコマンドを使います。

久々にfindコマンドを使っていて、アスタリスクを含む文字列を -name オプションに付けたら以下のようなエラーが出ました。

$ find . -name *ts 
find: env.d.ts: unknown primary or operator

は?と思いましたが、以下のように実行すれば期待通りの結果が帰ってきます。

$ find . -name '*ts'

そういえばこういうのあったな〜と思いつつも、なぜ引用符が必要なのか気になったのでググりました。考えてみれば当たり前のことですが、どうやらシェル(bashやzshなど)が先にアスタリスクを展開して使ってしまうからのようです。つまり最初の例は以下のコマンドを最初に実行する形になってたものと思われます。(hoge.ts と fuga.ts はカレントディレクトリにあるファイル)

$ find . -name hoge.ts env.d.ts fuga.ts

シェルのほうの親切機能のせいで起こっていたエラーということですね。細かい挙動はシェルによって違ってきます。スクリプト書くときは引数には引用符つけるのをクセにしておくのが良さそうな感じです。

参考: https://unix.stackexchange.com/questions/369419/when-and-why-do-i-need-to-quote-asterisks