You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用grep筛选所有人可读且指定所有者的文件正则写法问题

问题原因

你原有正则的.*${2}$要求用户名出现在整行末尾,但ls -l的输出结构为权限 硬链接数 所有者 所属组 文件大小 修改时间 文件名,所有者字段位于行中、不是行尾,因此匹配失效。

修复方案1:调整grep正则

调整正则匹配逻辑,匹配权限规则后跳过硬链接数字段,再匹配所有者即可:

ls -l "$filepath" | grep "^.r..r..r\s\+\S\+\s\+${2}\s"

正则说明:

  • ^.r..r..r 保留原有权限匹配逻辑,确认所有者、用户组、其他用户均有读权限
  • \s\+\S\+\s\+ 匹配权限和所有者之间的「空格+硬链接数+空格」部分
  • ${2}\s 匹配传入的所有者用户名,末尾加空格是为了避免短用户名匹配到更长用户名的前缀(例如搜索admin不会误匹配admin123)

如果使用GNU grep,可以加-P参数启用Perl正则,同时用\Q\E转义用户名中的特殊正则字符,兼容性更强:

ls -l "$filepath" | grep -P "^.r..r..r\s+\d+\s+\Q${2}\E\s"

修复方案2:使用find命令(更可靠)

解析ls输出本身存在很多兼容性风险,更推荐直接用find实现需求,语法更严谨:

# 仅匹配当前目录下的普通文件,需要递归可删除-maxdepth 1参数,需要匹配目录可删除-type f参数
find "$filepath" -maxdepth 1 -type f -perm -u=r -perm -g=r -perm -o=r -user "${2}" -ls

参数说明:

  • -perm -u=r -perm -g=r -perm -o=r 要求三类用户均具备读权限
  • -user "${2}" 要求文件所有者为传入的第二个参数指定的用户
  • -ls 输出与ls -l格式一致的结果

内容的提问来源于stack exchange,提问作者Vinny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:27:03