我正在尝试查找特定软件包的安装目录。我有一个特定的关键字,我正尝试使用该关键字查找特定文件。
在 grep 期间,我只想包含cpp 或 h文件类型。我不希望 grep 显示警告喜欢没有权限或者 找不到目录。我只想让它显示匹配的文件,不做其他事情。请建议我该怎么做?
目前我正在使用
grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
答案1
这些警告直接发送到stderr
流,而不是标准输出文件描述符。您可以通过2>/dev/null
在命令末尾添加来使 stderr 输出静音。
答案2
比过滤警告更直接的是,您可以通过添加以下内容来禁用它们-s
:
grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./
此选项存在一些兼容性问题。不过,这对于个人使用来说应该不成问题。
-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 指定。)
答案3
我曾经收到过很多这样的烦人的消息:
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
使用 shorthand 标志-s
。这也会删除消息Is a directory
,但也会隐藏其他可能更有用的消息。例如,如果您正在执行嵌套搜索,*/*/*
并且不存在符合该模式的文件,则它不会告诉您这一点。
答案4
在特定文件中进行递归搜索时,最好使用ack-grep
。这里的语法是:
ack-grep -i "My term" --cpp --h
要删除权限错误消息,您可能需要运行相同的命令sudo
:
ack-grep -i "My term" --cpp --h
但最终,如果您想搜索已安装的软件包,请查看以下各种选项:https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages