包含给定字符串的文件数


19

如何计算包含给定字符串作为bash / sh输入的文件(在目录中)的数量?

Answers:


30

grep -l "string" * | wc -l 会在工作目录中所有文件的内容中搜索“字符串”,并告诉您有多少匹配。


1
如果目录中有很多文件,这将无法正常工作,它将引发错误“ zsh:参数列表过长:grep”。关于如何摆脱这一点的任何想法?

1
@ user16142 grep目录而不是文件:grep -lr "string" directory | wc -l如果您不想进行递归搜索,则可以使用find with maxdepth选项:find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -l请注意,第二个选项比grep慢。
Agargara '17

9

greps参数-l将只输出它们是匹配的文件名$PATTERNwc可以算算账他们。

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

谢谢,但是想知道文件中的模式...对这个模棱两可的问题感到抱歉

如果是这样,请听沃尔夫的回答。
WAG

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

澄清:这将查找在其内容而不是文件名中具有“ pattern_to_look_for”的文件数(例如Wag的答案)。从您的问题很难说出您要寻找什么。


但是缺少了什么?因为它不起作用

如果要查找字符串鸭子,则必须在Awk中将其写为/ duck /。你在那样吗
Jan Persson

是的,输出:awk:读取错误(是目录)

沃尔夫的答案将为您提供重复。如果在其中一个文件中要查找的字符串多次出现,它将被视为额外的匹配项。
Jan Persson

好吧,如果您在文件夹中有目录,则必须做一些额外的事情,例如用类似这种方法替换星号find . ! -name . -prune -type f(不要错过反引号)。此命令仅列出文件夹中的文件。
Jan Persson

2

在Bash中可以使用任何文件名运行:

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

说明:

  • grep-Z选项以␀字节分隔符打印每个结果。该字符不能成为文件名的一部分,因此我们可以简单地计算分隔符的数量来获取文件的数量。
  • 为了摆脱在输出中其他人物的,我们只是删除一切,除了字节使用␀ tr
  • 然后用来计数字符wc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.