findでアスタリスクを使用する場合の注意点

久々の投稿になってしまいました。

ちょっとインフラエンジニアから外れ、他の職種へ武者修行の旅に出ていたため(現在進行中)、なかなか更新タイミングがありませんでした。

また機会を見つけてちょくちょく更新していきますね。

さて、今回はfindでファイルを探す際にアスタリスクを使用してファイルを検索したい時のお話。

 

findで複数ファイルを検索

 

皆さんはfindで複数のファイルを探してくださいと言われたら、すっとコマンドが出てきますか?

多くの人は例えば、↓のようなコマンドを想像すると思います。

find . -name *.log

実行すると、こんなエラーが出ます

find: パス名は評価式の前に置かなければいけません: hoge.log
使用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path…] [expression]

 

*の指定はワイルドカード扱い

 

find-nameオプションに*を使用すると、ワイルドカードの指定の解釈になります。

感のいい方ならもう気が付いたかもしれません。

ワイルドカードとは、0文字以上の文字があったら補完するということ。

lsコマンドで*を指定すると、指定ディレクトリのワイルドカードに合致するファイル名を取得してから表示されます。

つまり、lsしたいディレクトリ内にa.logb.logのファイルがあるとすると、ls *は、ls a.log b.logを実行しているのと同じになります。

findの場合も同じで、*を指定するとワイルドカードが展開されてしまうため、find . -name *.logとした場合、

find . -name a.log b.log

となってしまうわけです。

ちなみに検索ディレクトリ下にワイルドカードで展開した結果が1ファイルしかなかった場合は、エラーは起きず、きちんと結果が返ってきます。

 

どうすればfindで検索できる?

 

先ほど、起きたエラーの内容は構文エラーになります。

findの構文は

ここ で紹介してますが、

-nameのオプションに指定できる値は1つだけのため、b.log分にはオプションを付けてくださいというエラーが発生します。

そこで、これを解決するため、ワイルドカード部分をダブルクォート(”)で囲みます。

例:
find . -name "*.log"

これは、私の独断ですが、ダブルクォート(”)で囲むことで、ワイルドカードの展開が、コマンド実行タイミングになったのではないかと推測しています。(きちんと調べてなくて申し訳ない)

つまり、ダブルクォート(”)で囲まないとコマンド実行前にワイルドカードが展開、囲むとコマンド実行タイミングにワイルドカードが展開されるのではないかということです。

 

まとめ

 

さて、まとめになります

findで複数ファイルを検索するときは、

find . -name "*.log"

とダブルクォートで囲むこと。

ダブルクォートで囲まないとワイルドカードの展開が行われ、-nameオプションに2つ以上の値が設定されてしまい、エラーとなる。

よく忘れてやってしまうことの一つですね。

findを扱うときは気をつけましょう。

今回はfindのお話でした。

 
 

ブログランキングに参加しています。クリックして応援していただけると嬉しいです。

人気ブログランキング
ブログランキング・にほんブログ村へ
にほんブログ村