contents
久々の投稿になってしまいました。
ちょっとインフラエンジニアから外れ、他の職種へ武者修行の旅に出ていたため(現在進行中)、なかなか更新タイミングがありませんでした。
また機会を見つけてちょくちょく更新していきますね。
さて、今回はfindでファイルを探す際にアスタリスクを使用してファイルを検索したい時のお話。
findで複数ファイルを検索
皆さんはfindで複数のファイルを探してくださいと言われたら、すっとコマンドが出てきますか?
多くの人は例えば、↓のようなコマンドを想像すると思います。
find . -name *.log
実行すると、こんなエラーが出ます
使用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path…] [expression]
*の指定はワイルドカード扱い
find
の-name
オプションに*
を使用すると、ワイルドカードの指定の解釈になります。
感のいい方ならもう気が付いたかもしれません。
ワイルドカードとは、0文字以上の文字があったら補完するということ。
ls
コマンドで*
を指定すると、指定ディレクトリのワイルドカードに合致するファイル名を取得してから表示されます。
つまり、ls
したいディレクトリ内にa.log
、b.log
のファイルがあるとすると、ls *
は、ls a.log b.log
を実行しているのと同じになります。
find
の場合も同じで、*
を指定するとワイルドカードが展開されてしまうため、find . -name *.log
とした場合、
となってしまうわけです。
ちなみに検索ディレクトリ下にワイルドカードで展開した結果が1ファイルしかなかった場合は、エラーは起きず、きちんと結果が返ってきます。
どうすればfindで検索できる?
先ほど、起きたエラーの内容は構文エラーになります。
find
の構文は
ここ で紹介してますが、
-name
のオプションに指定できる値は1つだけのため、b.log
分にはオプションを付けてくださいというエラーが発生します。
そこで、これを解決するため、ワイルドカード部分をダブルクォート(”)で囲みます。
例:
find . -name "*.log"
これは、私の独断ですが、ダブルクォート(”)で囲むことで、ワイルドカードの展開が、コマンド実行タイミングになったのではないかと推測しています。(きちんと調べてなくて申し訳ない)
つまり、ダブルクォート(”)で囲まないとコマンド実行前にワイルドカードが展開、囲むとコマンド実行タイミングにワイルドカードが展開されるのではないかということです。
まとめ
さて、まとめになります
find
で複数ファイルを検索するときは、
find . -name "*.log"
とダブルクォートで囲むこと。
ダブルクォートで囲まないとワイルドカードの展開が行われ、-name
オプションに2つ以上の値が設定されてしまい、エラーとなる。
よく忘れてやってしまうことの一つですね。
findを扱うときは気をつけましょう。
今回はfindのお話でした。
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。
人気ブログランキング
にほんブログ村