我正在尝试查找特定包的安装目录。我有一个特定的关键字,我正在尝试使用它来查找特定文件。
在 grep 期间,我只想包含cpp 或 h文件类型。我不希望 grep 显示诸如Permission Denied或 Could 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 输出静音。
小智 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 指定。)
我曾经收到过很多这样烦人的消息:
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消息,但它也会抑制其他可能更有用的消息。例如,如果您在进行嵌套搜索*/*/*并且不存在该模式的此类文件,则它不会告诉您。