Grep,忽略警告

Grep,忽略警告

我正在尝试查找特定软件包的安装目录。我有一个特定的关键字,我正尝试使用该关键字查找特定文件。

在 grep 期间,我只想包含cpp 或 h文件类型。我不希望 grep 显示警告喜欢没有权限或者 找不到目录。我只想让它显示匹配的文件,不做其他事情。请建议我该怎么做?

目前我正在使用

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./

答案1

这些警告直接发送到stderr流,而不是标准输出文件描述符。您可以通过2>/dev/null在命令末尾添加来使 stderr 输出静音。

答案2

比过滤警告更直接的是,您可以通过添加以下内容来禁用它们-s

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

此选项存在一些兼容性问题。不过,这对于个人使用来说应该不成问题。

-s,--no-messages:抑制有关不存在或不可读文件的错误消息。可移植性注意事项:与 GNU grep 不同,第 7 版 Unix grep 不符合 POSIX,因为它缺少 -q,并且其 -s 选项的行为类似于 GNU grep 的 -q 选项。USG 样式的 grep 也缺少 -q,但其 -s 选项的行为类似于 GNU grep。可移植的 shell 脚本应避免使用 -q 和 -s,而应将标准和错误输出重定向到 /dev/null。(-s 由 POSIX 指定。)

答案3

我曾经收到过很多这样的烦人的消息:

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

原因是该--directories标志默认为read。我将其更改为recurse;如果您不希望它自动进行递归搜索,您可以改用skip

处理这个问题最简单的方法是将其设置在环境变量中。在~/.bash_profile~/.bashrc取决于您的发行版:

export GREP_OPTIONS='--directories=recurse'

现在,每当我使用 grep 时,它都会自动抑制这些消息。

另一个选项是--no-messages使用 shorthand 标志-s。这也会删除消息Is a directory,但也会隐藏其他可能更有用的消息。例如,如果您正在执行嵌套搜索,*/*/*并且不存在符合该模式的文件,则它不会告诉您这一点。

答案4

在特定文件中进行递归搜索时,最好使用ack-grep。这里的语法是:

ack-grep -i "My term" --cpp --h

要删除权限错误消息,您可能需要运行相同的命令sudo

ack-grep -i "My term" --cpp --h

但最终,如果您想搜索已安装的软件包,请查看以下各种选项:https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

相关内容