当前位置: 首页>>技术问答>>正文


Grep,忽略警告

, ,

问题描述

我试图找到特定包的安装目录。我有一个关键字,我试图找到一个特定的文件。

在grep期间,我只想包含cpp或h文件类型。我不希望grep显示警告,如权限被拒绝或无法找到目录。我只想让它显示匹配的文件,没有别的。请建议我该怎么做?

目前我正在使用

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

最佳解决思路

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

次佳解决思路

比过滤警告更直接,您可以通过添加-s来禁用它们:

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

此选项存在一些兼容性问题。但是,这不应该是个人使用的问题。

-s, –no-messages: Suppress error messages about nonexistent or unreadable files. Portability note: unlike GNU grep, 7th Edition Unix grep did not conform to POSIX, because it lacked -q and its -s option behaved like GNU grep’s -q option. USG-style grep also lacked -q but its -s option behaved like GNU grep. Portable shell scripts should avoid both -q and -s and should redirect standard and error output to /dev/null instead. (-s is specified by POSIX.)

第三种解决思路

我过去常常收到大量烦人的消息:

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标志,简写为-s。这也将消除Is a directory消息,但它也会抑制其他可能更有用的消息。例如,如果您在*/*/*中进行嵌套搜索,并且不存在该模式的此类文件,则不会告诉您。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1900.html,未经允许,请勿转载。