递归地查找特定文件

递归地查找特定文件

我尝试使用 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错误。

  1. 您可以2>/dev/null像这样添加到命令末尾:

    grep -rn --include="*.py" "search-pattern" 2>/dev/null
    

    这会抑制所有错误消息,因此您不会看到Permission denied弹出的错误。但这显然仍然意味着 grep 不会搜索这些文件,因此如果它们确实包含您的搜索模式,您将不会在输出中看到它们。

    解释
    在 Linux 中,有三种东西称为文件描述符stdin,,stdoutstderr如果运行命令时出现错误,则该错误将写入文件描述符stderr。默认情况下,stderr将错误输出到终端。所以我们能做的就是重定向错误,即将错误重定向到stderr终端以外的其他地方。我们在 Linux 中使用符号重定向内容>。那么我们要将重定向到哪里stderr呢?到/dev/null/dev/null是一个特殊文件;把它想象成一个黑洞。任何重定向到它的东西都会被丢弃。最后,我们stderr简称为数字2。所以2>/dev/null告诉 Linux 重定向2/dev/null1意思是stdout(这是命令的正常输出,即不是错误)。所以,例如,如果你想要将 grep 命令的实际输出保存到文件而不是将其显示在终端中,你可以使用1>/path/to/filename,它将重定向stdout到该文件。

  2. 与您的命令一起使用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 的图形版本。

如果您有更多固有问题,请随时在此处发表评论,如果我有任何帮助,请不要忘记按左上箭头。祝您
有美好的一天。

相关内容