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=*.rc
给grep
,因此:
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
强制打印文件路径的选项。
使用zsh
shell,您还可以执行以下操作:
grep -n GUNARS /dev/null ~/Opstk/bin/gadin-1.0/**/*.rc(.)
常规文件的查找是通过递归通配符和通配符限定符完成的。
这有几个优点:
- 对文件列表进行排序
- 排除隐藏的(可以使用 glob 限定符添加回来
D
)。 - 即使文件名不是由有效文本组成的也适用
但也有一些缺点:
- 如果有大量匹配文件,可能会达到系统命令长度的限制(可以使用 解决
zargs
)。 - 如果没有匹配的文件就会报错。
1 在 csh 中,其中波形符扩展来自,~'/'
将扩展到名为的用户的主目录/
(或报告未知用户: /。错误)。
² 还要注意那些编码结尾与某些语言环境中多个字符的编码相同`
或相同的字符。\