find -exec ls -ld {} \; 是递归查看权限最稳方式,因逐个执行输出干净、权限列固定,且可加 2>/dev/null 屏蔽权限错误;而 ls -lR 格式混乱、易卡住、不适用于脚本解析。

用 find -exec ls -ld 查看递归权限最稳
直接 ls -lR 看起来简单,但实际会混入大量目录头信息(比如每进一个子目录就重复打印一次路径),而且对符号链接、特殊文件系统(如 /proc、/sys)容易卡住或报错。真正可靠的做法是让 find 逐个触发 ls -ld:
-
find /path -exec ls -ld {} \;—— 每个匹配项单独执行一次ls -ld,输出干净,权限列位置固定(第一列),方便 grep 或 awk 处理 - 加
2>/dev/null屏蔽无权访问的错误,比如find: ‘/proc/123/fd’: Permission denied - 如果只看普通文件,加
-type f;只看目录,加-type d;默认两者都包含 - 注意:不要写成
find /path -exec ls -ld {} +,虽然效率高,但会把多个路径拼成一行传给ls,导致权限列错位,难解析
用 find -printf 避免多次调用 ls(仅 GNU find)
如果你用的是 Linux(不是 macOS 或 BSD),find 支持 -printf,能一步输出结构化字段,比反复 fork ls 快得多:
-
find /path -printf "%M %n\n"→ 输出八进制权限码(如755)和文件名 -
find /path -printf "%m %u:%g %p\n"→%m是数字权限,%u/%g是用户名/组名,%p是完整路径 - 不支持
-printf的系统(如 macOS)会报错find: -printf: unknown option,此时必须退回-exec方案 -
%M输出类似drwxr-xr-x,但注意它不区分硬链接数、所有者等字段,纯看权限位时够用
ls -lR 的坑:别信它输出的“目录头”
ls -lR /path 确实递归,但它的格式设计是给人肉读的,不是给脚本 parse 的:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 每进一个子目录,先打印一行
/path/subdir:,再列内容;这行不是权限信息,但没标记,容易被当成文件名误处理 - 遇到符号链接,
ls -lR可能展开目标路径,也可能只显示链接本身,行为不一致 - 对空目录,
ls -lR不输出任何内容(连目录名都不打),而find -exec ls -ld一定输出一行drwxr-xr-x ... dirname - 若路径含空格或换行符,
ls -lR输出完全不可靠,find -print0+xargs -0才安全,但权限显示就得另想办法
权限字段怎么看:别只盯 rwx
无论用哪种命令,最终看到的权限字符串(如 -rwsr-xr-- 或 drwxr-sr-x)里,第 4、7、10 位可能藏着关键信息:
- 第 4 位(所有者执行位)是
s→ 表示 setuid,运行时以文件所有者身份执行 - 第 7 位(组执行位)是
s→ 表示 setgid,新建文件继承目录所属组 - 第 10 位(其他人执行位)是
t→ 表示 sticky bit,目录下文件只能由 owner 删除 -
ls -l不显示 ACL 或扩展属性,要查这些得用getfacl或stat -c "%a %A %n" file
递归看权限时,真正麻烦的从来不是命令怎么敲,而是看到 s 和 t 时要不要跟进查原因——它们往往意味着服务配置或共享目录的特殊策略。










