Grep,忽略警告

Nee*_*pta 57 search grep

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

在 grep 期间,我只想包含cpp 或 h文件类型。我不希望 grep 显示诸如Permission DeniedCould not find the Directory 之类的警告。我只是想让它显示匹配的文件,没有别的。请建议我该怎么做?

目前我正在使用

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
Run Code Online (Sandbox Code Playgroud)

Jam*_*dge 68

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

  • 更具体一点“find”。2>/dev/null | 2>/dev/null | grep 404.html``` 是命令的样子 (2认同)

小智 33

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

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./
Run Code Online (Sandbox Code Playgroud)

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

-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 指定。)


and*_*ber 5

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

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory
Run Code Online (Sandbox Code Playgroud)

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

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

export GREP_OPTIONS='--directories=recurse'
Run Code Online (Sandbox Code Playgroud)

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

另一种选择是--no-messages标志,速记-s。这也将摆脱Is a directory消息,但它也会抑制其他可能更有用的消息。例如,如果您在进行嵌套搜索*/*/*并且不存在该模式的此类文件,则它不会告诉您。