我尝试使用 grep 在某些目录/子目录中查找 python 文件中的一些代码片段,但不幸的是我的尝试失败了 :(
我想:
grep -r "search-pattern" *.py
应该可以发挥魔力,但是它却失败了,提示“未找到匹配项”,尽管有几个文件包含符合搜索模式的行。
接下来我尝试了以下操作:
grep -r "search-pattern" .
看起来这个方法有效,但也返回了许多编译后的 c 文件和其他内容的错误。显然比我想要的要多。
最后,经过多次 Google 搜索,我找到了:
grep -rn --include="*.py" "search-pattern"
这完成了任务并找到了我要搜索的所有 python 文件。作为奖励,它还打印了包含搜索模式的行号。
但还有一个问题:一些“权限被拒绝”错误。我该如何摆脱它们?我以为处理 grep 很容易,但事实证明,要获得良好的结果、行号和没有错误,它很复杂。
任何帮助都将不胜感激:)
答案1
你收到这些Permission denied
错误是因为你的用户没有权限读取某些 python 文件,因此 grep不是处理这些文件(您无法搜索它们)。
您想“摆脱”Permission denied
错误。
您可以
2>/dev/null
像这样添加到命令末尾:grep -rn --include="*.py" "search-pattern" 2>/dev/null
这会抑制所有错误消息,因此您不会看到
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"
如果你的用户名具有 root 权限(即如果你是机器上的管理员),则
sudo
在命令之前使用会以 root 用户身份运行它,因此你永远不会收到Permission denied
错误和 grep将要搜索这些文件,如果找到则输出搜索模式。
答案2
这是一个常见问题,您可以直接从命令行解决它。
您可以使用--devices=skip
忽略特殊设备文件(许多系统上的错误和无限循环的来源)。
执行sudo chown -R new_owner_name file_pattern
以递归方式更改文件所有权并避免权限错误。
如果您重定向错误流,COMMAND 2> DESTINATION_OR_/dev/null
错误仍然会发生,您将无法从 grep 获得所需的结果。
如果可能的话永远不要sudo
自动使用进行分析(这可能是系统的弱点),尝试在需要时更改文件所有权。如果您需要向用户请求权限,可以使用 sudo 的图形版本。
如果您有更多固有问题,请随时在此处发表评论,如果我有任何帮助,请不要忘记按左上箭头。祝您
有美好的一天。