特定の文字列を含むファイルの数


18

bash / shの入力として特定の文字列を含む(ディレクトリ内の)ファイルの数をカウントするにはどうすればよいですか?

回答:


29

grep -l "string" * | wc -l 作業ディレクトリ内のすべてのファイルの内容で「文字列」を検索し、一致した数を通知します。


1
ディレクトリに多くのファイルがある場合、これは機能しません。エラー「zsh:引数リストが長すぎます:grep」がスローされます。これを取り除く方法についてのアイデアはありますか?

1
@ user16142ファイルの代わりにディレクトリをgrep:grep -lr "string" directory | wc -l再帰検索が必要ない場合は、maxdepthオプションでfindを使用できます。find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lこの2番目のオプションはgrepよりも遅いことに注意してください。
アガルガラ

9

grepsパラメータ-l$PATTERN、一致するファイル名のみを出力し、wc後でカウントできます。

grep -l "$PATTERN" * | wc -l

ありがとう、しかし、ファイルのパターンに疑問を抱いていた...あいまいな質問を申し訳ありません

もしそうなら、ウルフの答えを取る。
ワグ

3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

明確化:これは、ファイル名ではなくコンテンツに「pattern_to_look_for」を含むファイルの数を探します(Wagの答えのように)。あなたの質問から、あなたが探しているものを伝えるのは難しいです。


しかし、何か不足していますか?動作しないため

文字列duckを探す場合は、Awkで/ duck /のように記述する必要があります。あなたはそれをやっていますか?
ヤンパーソン

はい、出力:awk:読み取りエラー(ディレクトリです)

オオカミの答えはあなたに重複を与えます。ファイルの1つで探している文字列の出現が複数ある場合、余分な一致としてカウントされます。
ヤンパーソン

フォルダー内にディレクトリがある場合は、星をこのようなものに置き換えるなどの追加作業を行う必要がありますfind . ! -name . -prune -type f(バッククックをお見逃しなく)。このコマンドは、フォルダー内のファイルのみをリストします。
ヤンパーソン

2

これは、Bashで任意のファイル名で機能します。

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

説明:

  • grep-Zオプションは、すべての結果を␀バイト区切りで出力します。この文字をファイル名の一部にすることはできません。したがって、セパレータの数を数えるだけでファイルの数を取得できます。
  • 出力内の他の文字を削除するには、を使用して␀バイト以外のすべて削除しますtr
  • 次に、で文字をカウントしwcます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.