grep 似乎忽略了 --include

grep 似乎忽略了 --include

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 *
  1. 如上所述,-r 开关允许 grep 搜索子目录,否则不会,这使得 grep 看起来失败。
  2. 简单的文件类型包含(一个扩展名)无需调整。
  3. 不要引用(单引号或双引号)包含内容,解析器不喜欢它

为了包含多个扩展,我使用 bash 大括号扩展。

    grep -r --include=*.{html,htm,js} li *

如果您仍然遇到问题,可以尝试其他方法

  1. 当 shell 解析它时,转义 * 来保护它

    grep -r --include=\*.html li *
    
  2. 让搜索路径更加明确

    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 没有正确关联我的帐户。 (模组:请对此进行评论!)

相关内容