仅使用grep搜索文本文件

78
find . -type f | xargs file | grep text | cut -d':' -f1 | xargs grep -l "TEXTSEARCH" {}

这是一个好的解决方案吗?用于在仅包含文本文件中递归查找TEXTSEARCH。

3个回答

266

您可以在 grep 命令中使用-r(递归)和-I(忽略二进制文件)选项:

$ grep -rI "TEXTSEARCH" .
  • -I:对二进制文件处理时不考虑是否有匹配项;等同于选项--binary-files=without-match
  • -r:递归读取每个目录下的所有文件;等同于选项-d recurse

不,这个不能忽略特殊文件,比如Unix套接字。 - http8086

9
如果您知道要搜索的文件扩展名,则可以非常简单地在当前目录中递归地搜索所有*.txt文件,不区分大小写:
grep -ri --include=*.txt "sometext" *

5
--include 标志需要用引号括起来的文件匹配模式,否则它将不能正常工作。正确的使用方式是 --include="*.txt"。请注意,不要改变原始意思。 - tralph3

7
另一个不太优雅的解决方案是,在不使用xargs和cut的情况下,在find命令中链接-exec命令:
find . -type f -exec bash -c "file -bi {} | grep -q text" \; -exec grep TEXTSEARCH {} ";" 

26
请看下一个回答。不要使用这个回答。 - coder543
3
这很复杂且效率低下。内置的grep工具能够通过单个标志解决问题。这个答案可能可以完成任务,但考虑到其他方法的存在,它是一个糟糕的解决方案。你同意吗? - coder543
2
这很大程度上取决于要搜索的文件数量和它们的大小。通常,如果搜索运行0.01秒或0.001秒并不重要。尽管如此,kevs的答案打字速度更快,更容易记住,即使您不记得任何一个也更容易查找。然而,我想我的命令展示了如何使用find链接过滤器,这是一个有用的技巧,所以我不想删除它,即使我赞成kevs的解决方案。 - user unknown
10
不是所有版本的grep都支持"-I"选项。 - user606723
这个答案更加灵活和有用,因为find命令的结果可以按MIME类型进行过滤。 - Big Shield
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接