Grep 模式包括破折号并限制为文件扩展名

Grep 模式包括破折号并限制为文件扩展名

我正在尝试使用 grep 来查找一些包含该模式的 tex 文件->-

grep -R -- "->-" *.tex

但这行不通。如果我做:

grep -R -- "->-"

相反,它可以工作,但速度非常慢,并且清楚地不仅给我提供了 tex 文件,而且还匹配了许多其他文件(例如二进制文件)。

进行此搜索的最快方法是什么?

答案1

尝试find使用:grep-exec

find path_to_tex_files_directory -name "*.tex" -exec grep -- "->-" {} \;

或与xargs

find path_to_tex_files_directory -name "*.tex" | xargs grep -- "->-"

答案2

问题是-R告诉grep递归搜索目录中的所有文件。因此,您不能将其与特定的文件组组合。因此,您可以使用find 正如@KM 所建议的。,或 shell 通配符:

$ shopt -s globstar
$ grep -- "->-" **/*.tex

shopt命令激活 bash 的 globstar 功能:

globstar
                  If set, the pattern ** used in a pathname expansion con‐
                  text will match all files and zero or  more  directories
                  and  subdirectories.  If the pattern is followed by a /,
                  only directories and subdirectories match.

然后,您给出**/*.tex一个模式,它将匹配.tex当前目录和任何子目录中的所有文件。

如果您使用的是zsh,则不需要shopt(无论如何这是 bash 功能),因为zsh默认情况下可以执行此操作。

答案3

如果您grep支持1,您可以使用该--include开关:

grep -R --include '*.tex' -- "->-"

或者

grep -R --include='*.tex' -- "->-"

1:
至少在 GNU 中可用grep

--include=GLOB
        Search only files whose base name matches GLOB

和操作系统grep

--include
        If specified, only files matching the given filename pattern are searched.

答案4

-R选项代表递归,我猜你在模式 *.tex 中没有目录。

也许尝试这样的事情:

find . -name \*.tex -exec grep -l -- "->-" {} \;
  • -l如果你不关心文件名,你可以删除选项
  • 如果你想查看文件名和模式:

    find . -name \*.tex -exec grep -l -- "->-" {} \; | xargs grep -- "->-"
    

    但这是一个双重 grep,@KM 解决方案似乎更好..

相关内容