按文件类型在特定目录中递归地使用 grep 模式

按文件类型在特定目录中递归地使用 grep 模式

grep这是按GUNARS目录中模式的文件类型递归执行的方法吗gadin-1.0

grep -rn --include=*.rc "GUNARS" ~/Opstk/bin/gadin-1.0/"

答案1

--include=*.rc是使用 shell 功能向shell 询问当前目录中以以下方式开头--include=和结尾的文件名列表的方法:.rc通配,文件名生成或者路径名扩展

例如参见:

zsh% echo --include=*.rc
zsh: no matches found: --include=*.rc
zsh% : > --include=foo.rc > --include=bar.rc
zsh% ls
'--include=bar.rc'  '--include=foo.rc'
zsh% echo --include=*.rc
--include=bar.rc --include=foo.rc

在这里,您想将文字传递--include=*.rcgrep,因此:

grep -rn '--include=*.rc' GUNARS ~/Opstk/bin/gadin-1.0/

或者:

grep -rn --include='*'.rc GUNARS ~/Opstk/bin/gadin-1.0/

*需要引用即可。不需要GUNARS加引号,因为这 6 个字符在 shell 的语法中都不是特殊的。

该代码中 shell 语法中的特殊字符是:

  • 此处用于分隔参数的空格
  • ~HOME在类 csh 和 Korn/POSIX 类 shell 以及至少一些更现代的 shell 中,它会扩展为环境变量(您的主目录)的值。
  • 换行符,它分隔该命令。

他们是那些一定不被引用。如果您愿意,您可以引用其他所有内容,但在包括 在内的几个 shell 中bash~单词开头的 a 后面需要跟着未引用的 /:待扩展¶:

'grep' '-rn' '--include=*.rc' 'GUNARS' ~/'Opstk/bin/gadin-1.0/'

比较:

bash-5.2$ echo ~'/'
~/
bash-5.2$ echo ~/
/home/me/

在上面提到的类似 Bourne 的 shell(例如 zsh 或 bash)中,您可以使用双引号代替单引号,但请注意,在双引号内,仍然有一些字符保留其特殊含义($, `, \²)。

对于grep-r--include是非标准选项。并非所有grep实现都支持这些实现,以及那些对它们进行不同解释的实现(许多 for -r,少数 for --include)。

在 常规文件中报告包含 GUNARS文件名和行号的标准且更可移植的方法是:.rc$HOME/Opstk/bin/gadin-1.0/

find ~/Opstk/bin/gadin-1.0/ -name '*.rc' -type f \
  -exec grep -n GUNARS /dev/null {} +

/dev/null要确保grep传递至少两个文件。当仅传递一个文件时,它不会打印其路径。某些grep实现具有-H强制打印文件路径的选项。

使用zshshell,您还可以执行以下操作:

grep -n GUNARS /dev/null ~/Opstk/bin/gadin-1.0/**/*.rc(.)

常规文件的查找是通过递归通配符和通配符限定符完成的。

这有几个优点:

  • 对文件列表进行排序
  • 排除隐藏的(可以使用 glob 限定符添加回来D)。
  • 即使文件名不是由有效文本组成的也适用

但也有一些缺点:

  • 如果有大量匹配文件,可能会达到系统命令长度的限制(可以使用 解决zargs)。
  • 如果没有匹配的文件就会报错。

1 在 csh 中,其中波形符扩展来自,~'/'将扩展到名为的用户的主目录/(或报告未知用户: /。错误)。

² 还要注意那些编码结尾与某些语言环境中多个字符的编码相同`或相同的字符。\

相关内容