
私はこれを実行したい:
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 {} +
または、シェルを使用している場合は、bash
nullglobオプションを設定して、拡張されていない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オプションです。
答え2
zshシェルユーザーは、ダブルアスタリスクを使用して自然にこれを達成できる組み込みのワイルドカード構文があることをすばやく指摘します。
grep -r zlib **/*.cpp
必要に応じて、永久に切り替えることなく「zsh」を一度だけ実行できます。