* .cファイルの再帰grepが失敗する


13

次の方法で、すべての.cファイルのパターンを再帰的に検索しようとしました

> grep -lr search-pattern *.c

しかし、これを出力として取得しました

> grep: *.c: No such file or directory

これを使用する場合:

> grep -lr search-pattern *

たくさんあります。パターンを持つディレクトリ内のcファイル。

以前の式の何が問題になっていますか?

回答:


22

次の--includeオプションを使用することをお勧めしますgrep

grep -lr --include='*.c' search-pattern .

1
+1。私は--include=GLOBオプションを知りませんでした。再帰的オプションと組み合わせることで、これは非常に強力であり、必要ありませんfind。いいね!
gertvdijk

ここでパーティーに遅れました.が、コマンドの最後が何のためにあるのかについて私は混乱しています。
ネイサンジョーンズ14

1
@NathanJones:grepには、検索する1つ以上のファイル名またはディレクトリが必要です。ドットは言う:カレントディレクトリで検索
enzotib

3

*.cパターンはシェルによって評価されます。を使用する場合と同様に、現在のディレクトリに適用されますls *.c

代わりに、*.cパターンに一致するすべてのファイルを(再帰的に)grep検索し、その中から検索する必要があると思います。これを行う方法は次のとおりです。

find . -name "*.c" -print0 | xargs --null grep -l search-pattern

xargs検索結果を追加するために使用しますfind


別の方法として、-execオプションを使用して検索します。例:

find . -name "*.c" -exec grep -l search-pattern "{}" \;

また、-lオプションが本当に必要かどうかはわかりませんgrep。最初の一致で停止します:

-l, --files-with-matches
      Suppress normal output; instead print the name of  each
      input  file  from which output would normally have been
      printed.  The scanning will stop on  the  first  match.
      (-l is specified by POSIX.)

find/xargsスペースを含むファイル名の構文ブレーク。-Lオプションgrep、各ファイルの最初の試合でストップし、次のファイルを続行:1のパターンのみが与えられたそれぞれのファイルで、それが迅速である、少なくとも一度含まれているかどうかを確認したい場合。
enzotib

@enzotibありがとう、-print0オプションとを使用して修正しましたxargs --null
gertvdijk

-1

私はこれがかなり古いスレッドであることを知っていますが、私は同じ質問をしていたので、同じことを達成するための好ましい方法を、はるかに短い形式で共有したいと思います。

ls | grep "file.*.c"

2
問題は、ファイルを検索することではなく、パターンを検索することです。
ジェイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.