NetBSD环境下如何在Bash中列出当前用户可读的所有文件?
在NetBSD Bash下列出当前用户可读的所有文件
在NetBSD的Bash环境下,你之前考虑的ls -l | grep或者简单的find .确实没法覆盖所有场景——毕竟权限不止属主和属组这两种情况,其他用户组的可读权限也得考虑进去。我给你几个靠谱的实现方法:
最简洁准确的方法:用find的-readable选项
NetBSD自带的find工具支持-readable测试条件,它会直接检查当前用户是否对目标文件有读取权限,不管文件的属主、属组是谁,也能正确处理你所属的所有用户组权限,完全不用手动判断权限位。
如果只想列出文件(不包括目录),用这条命令:
find . -type f -readable
要是需要包括目录(毕竟目录的读权限允许你查看其内容),去掉-type f即可:
find . -readable
排除特定目录(可选)
如果有不需要扫描的目录(比如./.git或者./node_modules),可以用-prune来跳过它们,比如:
find . -path ./.git -prune -o -type f -readable -print
如果要排除多个目录,用-o连接即可:
find . \( -path ./.git -o -path ./node_modules \) -prune -o -type f -readable -print
手动判断权限(进阶)
如果你不想依赖-readable选项(虽然NetBSD完全支持),可以手动组合权限条件。不过要注意:这种方法需要处理你所属的所有用户组,而id -g -n只能获取主组,所以如果你属于多个附加组,这种方法会有遗漏,不如-readable省心。示例命令:
find . -type f \ \( -user "$USER" -perm -u=r \) \ -o \( -group "$(id -G -n | tr ' ' '\n' | xargs -I {} echo "-group {} -o " | sed 's/ -o $//')" -perm -g=r \) \ -o \( -perm -o=r \)
这条命令会检查三种可读场景:
- 文件属主是你,且用户位有读权限;
- 文件属组是你所属的任意组,且组位有读权限;
- 其他用户位有读权限。
内容的提问来源于stack exchange,提问作者HSchmale
相关产品推荐
相关产品推荐

