grep只有文本文件

Ste*_*ini 52 bash grep

find . -type f | xargs file | grep text | cut -d':' -f1 | xargs grep -l "TEXTSEARCH" {}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的解决方案?仅在文本文件中递归查找TEXTSEARCH

kev*_*kev 203

您可以在以下位置使用-r(递归)和-I(忽略二进制)选项grep:

$ grep -rI "TEXTSEARCH" .
Run Code Online (Sandbox Code Playgroud)
  • -I 处理二进制文件,就好像它不包含匹配数据一样; 这相当于--binary-files=without-match选项.
  • -r 递归地读取每个目录下的所有文件; 这相当于-d recurse选项.


use*_*own 5

另一个不如kevs优雅的解决方案是,将find -exec命令链接在一起查找,而不需要xargs和cut:

find . -type f -exec bash -c "file -bi {} | grep -q text" \; -exec grep TEXTSEARCH {} ";" 
Run Code Online (Sandbox Code Playgroud)

  • 看下一个答案.不要使用这个. (24认同)
  • 并非所有版本的grep都支持`-I` (7认同)
  • 它复杂而且效率低下.内置的grep工具能够用单个标志解决问题.这个答案可能会起作用,但鉴于另一个人的存在,这是一个糟糕的解决方案.你不同意吗? (3认同)
  • 这在很大程度上取决于要搜索的文件数量及其大小。通常,如果搜索运行 0.01 秒或 0.001 秒,人们并不感兴趣。尽管如此,kevs 的答案输入速度要快得多,更容易记住,即使您不记得其中任何一个,也更容易查找。但是,我想我的命令显示了如何使用 find 链接过滤器,这是一个有用的东西,所以我不喜欢删除它,即使我赞成 kevs 解决方案。 (2认同)

小智 5

如果您知道要搜索的文件扩展名是什么,那么可以通过一种非常简单的方法从当前目录中搜索所有 *.txt 文件,递归遍历所有子目录,不区分大小写:

grep -ri --include=*.txt "sometext" *

  • `--include` 标志需要用引号括起来的全局模式。这实际上是行不通的,更像是这样:`--include="*.txt"`。 (3认同)