Grep,忽略警告


50

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

在grep期间,我只想包含cpp或h文件类型。我不希望grep显示诸如“ 权限被拒绝”或“ 找不到目录”之类的警告。我只希望它显示匹配的文件,仅此而已。请提出我该怎么做?

目前我正在使用

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

Answers:


56

stderr与标准输出文件描述符相反,这些警告针对流。您可以通过2>/dev/null在命令末尾添加来使stderr输出静音。


更具体的find . 2>/dev/null | grep 404.html是命令的外观
csga5000 '18

30

比过滤警告更直接的方法是,您可以通过添加禁用警告-s

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

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

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


我刚刚安装了13.04,但遇到的错误是我没有使用12.04的错误。可能是某些事情发生了变化吗?我认为grep会停止警告文件为目录是很酷的,因为在大多数情况下,我只是不在乎!
Alexis Wilke

抱歉,我仍然是12.10,所以我无法确认这一点。
Sebastian vom Meer 2013年

5

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

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消息,但也会抑制其他可能更有用的消息。例如,如果您要进行嵌套搜索*/*/*,但不存在该模式的此类文件,它将不会告诉您。


很好的解释
aldr

1

替代grep递归操作的替代方法-ir 是让find命令(默认情况下是递归的)处理带有-readable标志的权限和使用标志排除的路径-not -path "*.svn*",然后将文件传递给grep。通过-type f仅查找常规文件来排除目录。

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.