仅在非源代码的纯文本文件中搜索

仅在非源代码的纯文本文件中搜索

ELF我使用以下命令在当前目录下的纯文本文件中递归搜索字符串:

grep ELF -r .

但它也搜索二进制文件(例如 zip 文件、PDF 文件)以及 HTML 文件和.js.

如何指定它仅在非源代码的纯文本文件中搜索?

答案1

使用 GNU grep,传递--binary-files=without-match忽略二进制文件。源代码文件是文本文件,因此它们将包含在结果中。

如果您想忽略具有某些扩展名的文本文件,您可以使用该--exclude选项,例如

grep -r --exclude='*.html' --exclude='*.js' …

或者您可以只包含显式匹配的文件,例如

grep -r --include='*.txt' …

如果您想忽略作为源代码的文本文件,您可以使用file命令猜测哪些文件是源代码。这使用启发式方法,因此它可以将源代码检测为非源代码,反之亦然。

find -type f exec sh -c '
  for x do
    case $(file <"$x") in
      *source*) :;; # looks like source code
      *text*) grep -H -e "$0" "$x";; # looks like text
      # else: looks like binary
    esac
  done
' "REGEXP" {} +

或者

find -type f exec sh -c '
  for x do
    case $(file -i <"$x") in
      text/plain\;*) grep -H -e "$0" "$x";; # looks like text
      # else: looks like source code or binary
    esac
  done
' "REGEXP" {} +

或者,您可以使用确认而不是 grep。 Ack 集成了基于文件名的文件分类系统。默认情况下,它适合在源代码中搜索,但您可以通过传递选项告诉它搜索不同类型--type使用 ack 搜索所有文件可能有帮助。

答案2

如果您只想通过文件扩展名进行限制,可以使用 grep --include 选项:

grep -R --include="*.txt" "pattern" /path/to/dir/

另一种方法是消除非文本但包含 html 和 js 文件的文件,更新后使用选项 --exclude 排除这些文件,例如:

find /path/to/dir -type f -print | xargs file | grep text | cut -f1 -d: | xargs grep --exclude=\*.{js,html} "pattern"

正如评论中提到的,您也可以使用 --exclude-from=FILE 选项。

相关内容