我正在尝试查找特定软件包的安装目录。我有一个特定的关键字,试图在其中查找特定文件。
在grep期间,我只想包含cpp或h文件类型。我不希望grep显示诸如“ 权限被拒绝”或“ 找不到目录”之类的警告。我只希望它显示匹配的文件,仅此而已。请提出我该怎么做?
目前我正在使用
grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
我正在尝试查找特定软件包的安装目录。我有一个特定的关键字,试图在其中查找特定文件。
在grep期间,我只想包含cpp或h文件类型。我不希望grep显示诸如“ 权限被拒绝”或“ 找不到目录”之类的警告。我只希望它显示匹配的文件,仅此而已。请提出我该怎么做?
目前我正在使用
grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
Answers:
比过滤警告更直接的方法是,您可以通过添加禁用警告-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指定。)
我曾经收到过很多这样的烦人的消息:
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
消息,但也会抑制其他可能更有用的消息。例如,如果您要进行嵌套搜索*/*/*
,但不存在该模式的此类文件,它将不会告诉您。
替代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" "{}" \;
在特定文件中进行递归搜索时,最好使用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
find . 2>/dev/null | grep 404.html
是命令的外观