问题描述
我试图找到特定包的安装目录。我有一个关键字,我试图找到一个特定的文件。
在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
消息,但它也会抑制其他可能更有用的消息。例如,如果您在*/*/*
中进行嵌套搜索,并且不存在该模式的此类文件,则不会告诉您。