dan*_*451 5 search directory grep 14.04
我尝试使用 grep 在分布在某些目录/子目录中的 python 文件中查找一些代码片段,但不幸的是我的尝试失败了:(
我想:
grep -r "search-pattern" *.py
Run Code Online (Sandbox Code Playgroud)
应该做魔术,但它失败了“没有找到匹配项”,尽管有几个文件包含带有搜索模式的行。
接下来我尝试了以下操作:
grep -r "search-pattern" .
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但也为一些编译的 c 文件和东西返回了许多错误。显然比我想要的要多。
最后,经过多次谷歌搜索,我想出了:
grep -rn --include="*.py" "search-pattern"
Run Code Online (Sandbox Code Playgroud)
这完成了工作并找到了我正在搜索的所有 python 文件。作为奖励,它还打印包含搜索模式的行号。
但仍然存在一个问题:一些“权限被拒绝”错误。我该如何摆脱这些?我认为处理 grep 会很容易,但结果证明要获得好的结果很复杂,行编号并且没有错误..
任何帮助将不胜感激:)
您收到这些Permission denied错误是因为您的用户无权读取某些 python 文件,因此 grep 不适用于这些文件(您无法搜索它们)。
您想要“消除”Permission denied错误。
您可以2>/dev/null像这样添加到命令末尾:
grep -rn --include="*.py" "search-pattern" 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
这会抑制所有错误消息,因此您不会看到Permission denied弹出的错误。但这显然仍然意味着 grep 不会搜索这些文件,因此如果它们确实包含您的搜索模式,您将不会在输出中看到它们。
说明:
在 Linux 中,存在三种称为文件描述符的东西:stdin、stdout、stderr。如果运行命令时出现错误,该错误将写入文件描述符stderr。默认情况下,stderr将错误输出到终端。所以我们能做的就是重定向错误,即我们重定向stderr到其他地方而不是终端。我们通过使用>符号来重定向 Linux 中的内容。那么我们要重定向到哪里呢stderr?到/dev/null。/dev/null是一个特殊的文件;把它想象成一个黑洞。您重定向到它的任何内容都会被丢弃。最后,我们简称为stderr数字2。所以2>/dev/null告诉 Linux 重定向2到/dev/null.1意味着stdout(这是命令的正常输出,即不是错误)。因此,例如,如果您想将 grep 命令的实际输出保存到文件中,而不是将其显示在终端中,则可以使用1>/path/to/filename,它将重定向stdout到该文件。
sudo假设您有权限,请使用您的命令:
sudo grep -rn --include="*.py" "search-pattern"
Run Code Online (Sandbox Code Playgroud)
如果您的用户名具有 root 权限(即,如果您是计算机上的管理员),则sudo在命令之前使用 root 用户身份运行它,因此您将永远不会收到错误Permission denied,并且 grep将搜索这些文件并输出搜索模式,如果它在它们里面找到了它。
| 归档时间: |
|
| 查看次数: |
10197 次 |
| 最近记录: |