我正在尝试使用 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 解决方案似乎更好..