複数のディレクトリに対する Grep クエリ

複数のディレクトリに対する Grep クエリ

私はこれを実行したい:

grep -r zlib *.cpp

ただし、現在のディレクトリに.cppファイルがないと失敗します(この場合は検索のみが行われます)。

 grep: *.cpp: No such file or directory

今:

grep -r zlib *

階層全体が検索されますが、検索を.cppファイルに制限したいと思います。

人々と多くのレシピサイトを検索しましたが、単純なクエリと思われるものへの答えが見つかりませんでした。事前にお詫び申し上げます。

ベストアンサー1

grep現在、シェルとは何の関係もありません。コマンドを実行する前に、シェルは*.cpp現在のディレクトリのすべてのcppファイル名に展開されますgrep*.cppシェルはファイル名が見つからないため、globを拡張しません。コマンドgrepはこれがファイルであることを確認しようとしますが、実際のファイルではないことがわかります。

いくつかのオプションがあります。find

find . -type f -name "*.cpp" -exec grep -r zlib {} +

または、シェルを使用している場合は、bashnullglobオプションを設定して、拡張されていないglobを有効な結果として返すのを停止します。(..)拡張シェルオプションをシェルで永続的にするのではなく、一時的にすることが目的です。その--include=*.cppオプションがあるのは、これを設定すると、グローバル拡張が失敗した場合に*.cpp空白になり、コマンドになるためですgrep -r zlib。つまり、下のサブディレクトリ全体を検索するという意味です。

( shopt -s nullglob; grep -r --include=*.cpp zlib . ; )

別のバリエーションには--includeオプションはありませんが、サブディレクトリで再帰的なグローバル拡張を可能にするオプションをgrep使用します。globstar

( shopt -s nullglob globstar; grep -rH zlib **/*.cpp  ; )

これを覚えており、--include=POSIX-Hと互換性のないGNU grepオプションです。

おすすめ記事