使用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
相关产品推荐
相关产品推荐

