【问题标题】:grep only text filesgrep 仅文本文件
【发布时间】:2012-04-06 02:37:02
【问题描述】:
find . -type f | xargs file | grep text | cut -d':' -f1 | xargs grep -l "TEXTSEARCH" {}

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

【问题讨论】:

    标签: bash grep


    【解决方案1】:

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

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

    【讨论】:

    • 不行,这个不能忽略特殊文件,比如unix socket
    【解决方案2】:

    另一个比 kevs 更不优雅的解决方案是将 find 中的 -exec 命令链接在一起,没有 xargs 和 cut:

    find . -type f -exec bash -c "file -bi {} | grep -q text" \; -exec grep TEXTSEARCH {} ";" 
    

    【讨论】:

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

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

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

    【讨论】:

    • --include 标志需要用引号括起来的全局模式。这是行不通的,更像这样:--include="*.txt".
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多