【问题标题】:Using grep for listing files by owner/read perms使用 grep 按所有者/读取权限列出文件
【发布时间】:2021-09-26 17:52:04
【问题描述】:

我的 bash 脚本的其余部分工作正常,只是在使用 grep 时遇到了问题。在每个文件上我都使用以下命令:

ls -l $filepath | grep "^.r..r..r.*${2}$"

如何正确使用正则表达式中的第二个参数?我想要做的是打印文件,如果它可以被任何人读取并且所有者是第二个参数传递的人。

使用:

ls -l $filepath | grep "^.r..r..r"

将根据读取权限成功打印信息。我正在尝试做的是基于... [读取权限] [之间的任何字符] [以所有者姓名结尾]

【问题讨论】:

标签: regex linux bash


【解决方案1】:

您尝试的直接问题是最终的$ 将搜索锚定到行尾,这是文件名的结尾,而不是所有者字段。更好的解决方案是用 Awk 替换 grep,它具有仅检查特定字段的内置支持。但实际上是don't use ls for this,或者根本就在脚本中。

很遗憾,stat 命令的选项并非完全可移植,但对于 Linux,请尝试

case $(stat -c %a:%u "$filepath") in
    [4-7][4-7][4-7]:"$2") ls -l "$filepath";;
esac

或者更便携

find "$filepath" -user "$2" -perm /444 -ls

遗憾的是,-perm /444 谓词也不是完全可移植的。

自相矛盾的是,事实上stat 获取文件权限的最便携替代品实际上可能是

perl -le '@s = stat($ARGV[0]); printf "%03o\n", $s[2]' "$filepath"

stat 调用返回一个字段列表;如果您也想要所有者,则数字 UID 位于 $s[4] 中, getpwuid($s[4]) 获取用户名。

【讨论】:

  • find 似乎是专门为此设计的。
  • 我实际上主要使用statfind 的目的是更普遍地搜索符合特定条件的文件,因此在单个命名文件上使用它很奇怪。
  • 一个问题,我被指示使用 ls 列出文件信息,然后将其通过管道传输到 grep。练习正则表达式是一项功课。给定一个传递的目录,我没有包含的算法创建一个数组,其中每个元素都是一个子目录和其中的文件。如果有帮助,我也可以包含该代码。我只需要弄清楚上面那个正则表达式的当前设置,它遵循格式 [read perms][ignore between][ownername]
  • 可能唯一的问题是最终的$ 将搜索锚定到行尾,这是文件名的结尾,而不是所有者字段。更好的解决方案是使用 Awk。展望未来,如果您有人为限制,可能会在您的问题中提及,例如工作说明。
  • 如果这解决了您的问题,请考虑投票和/或接受它。如果您愿意,欢迎您发布自己的答案并接受。接受答案通过将您的问题标记为已解决来帮助未来的访问者。另见help.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
相关资源
最近更新 更多