man grep
说
grep [OPTIONS] PATTERN [FILE...]
. . .
--include=GLOB
Search only files whose base name matches GLOB (using wildcard
matching as described under --exclude).
所以我输入了
grep --include="*.html" 'li' *
li
在当前目录中搜索 HTML 文件中的实例。相反,我得到了li
目录中任何位置的每次使用的列表,甚至在非 HTML 文件中也是如此。我究竟做错了什么?我尝试了各种变体,例如
grep --include=\*.html 'li' *
但没有任何运气。
答案1
--include=PATTERN
仅当您添加时才有效-r
$ grep -r --include='*.html' 'li' .
-R, -r, --recursive Read all files under each directory, recursively; this is equivalent to the -d recurse option.
--include=PATTERN Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN Recurse in directories skip file matching PATTERN.
答案2
您使用的 shell(bash、tsh、zsh 等)将决定命令行通配符是否有效。大多数人使用 bash,因为它默认安装在许多发行版上 - 我使用 bash。
以下语法一直对我有用。
grep -r --include=*.html li *
- 如上所述,-r 开关允许 grep 搜索子目录,否则不会,这使得 grep 看起来失败。
- 简单的文件类型包含(一个扩展名)无需调整。
- 不要引用(单引号或双引号)包含内容,解析器不喜欢它
为了包含多个扩展,我使用 bash 大括号扩展。
grep -r --include=*.{html,htm,js} li *
如果您仍然遇到问题,可以尝试其他方法
当 shell 解析它时,转义 * 来保护它
grep -r --include=\*.html li *
让搜索路径更加明确
grep -r --include=\*.html li ./*
答案3
find $directoryname -maxdepth 1 -name '*.html' | xargs grep 'li'
这里-maxdepth 1
仅在目录中搜索,而不是在其子目录中搜索。如果您想在子目录中搜索,请-maxdepth 1
在命令中删除。
答案4
grep -version
不起作用,但grep --version
给出
grep (GNU grep) 2.9
以及版权声明。
grep 'li' *.html
让 shell 进行通配,这对我来说没有用,因为我想递归。
-R
我最初尝试使用(或)命令-r
,但这也不起作用。该命令会递归,但会显示html
名称中没有(或路径中任何位置)的文件。所以也不是这样的。
我会将这些内容作为评论发布或编辑到原始内容中,但由于某种原因 StackExchange 没有正确关联我的帐户。 (模组:请对此进行评论!)