查看目录条目与 macOS 扩展元数据,识别 ACL、扩展属性与文件标志。
macOS 的 ls 来自 BSD 工具链,默认在终端里多列输出、被管道接走时单列输出,只显示非隐藏项。加 -l 后才展示类型、权限、链接数、所有者、组、大小和时间。macOS 在 BSD 版本上增加了 -@(扩展属性)、-e(ACL)、-O(文件标志)等选项,这些在 GNU ls 里没有同名短选项;-G、-T、-v 在 GNU ls 里也有同名短选项,但含义不同(GNU -G 不显示组名、-T 设置制表宽度、-v 是自然排序),不要按 macOS 的语义套用。
与 GNU 的差异要记牢:macOS 的 -v 是“原样打印不可打印字符”,不是 GNU 的自然排序;macOS 没有 --time-style、--block-size、--quoting-style、--group-directories-first。脚本需要稳定、可解析的文件清单时不要切 ls 输出,改用 find -print0 或 stat -f。
长格式权限后面的 @ 表示存在扩展属性,+ 表示存在 ACL,两者可能同时出现;-O 会额外打印 uchg、hidden、restricted 等文件标志。APFS 默认大小写不敏感但保留大小写,输入 ls Foo 也可能列出 foo。
# 查看下载目录(含隐藏项),并列出扩展属性名
% ls -la@ ~/Downloads
# 同时看 ACL 和文件标志;末尾的 + 与 uchg 是“删不掉/改不了”的线索
% ls -leO /usr/local/bin | head -n 20
# 按修改时间倒序,-T 显示完整时间,便于比对构建产物
% ls -lTt ~/Documents | head -n 10
# 只列目录本身;*/ 不会匹配点开头的隐藏目录
% ls -d ~/Library/*/
# -f 关闭排序并自动包含隐藏项,适合快速确认目录是否为空
% ls -f /etc | head
# 机器可读输出:文件名、字节数、权限、最后访问时间
% stat -f '%N %z %Sp %Sa' *
@ 或 + 不是权限位,而是扩展属性或 ACL 标记。看不到属性内容时用 ls -l@ 和 ls -le 展开,不要再猜 chmod。ls -l 里目录的大小只是目录 inode 占用的块数,不是目录内容总量。验证方式是对同一路径比较 ls -ld 与 du -sh。ls -v 在 macOS 上不是版本排序,而是强制原样输出不可打印字符。需要按版本排序时应改用 sort 或脚本处理。ls 不到,先检查是否在错误目录、文件名是否含空格或前导 -,以及卷是否大小写不敏感。用 ls -i 对比 inode 可确认是否为同一文件。uchg 标志时,即使权限是 rw- 也无法修改或删除,sudo 也不行;确认后用 chflags nouchg 文件 解除。ls 输出无法安全地按行切分。批量处理改用 find . -print0 配合 xargs -0。find — 按条件递归遍历,输出可安全交给脚本。xattr — 查看 @ 背后的扩展属性内容。chmod — 修改权限位和 ACL。ls — GNU 版对照,选项更全。dir — Windows 下的目录列表。stat — 查看 inode、时间与权限的底层信息。合上页面,先回答,再展开对照。
ls -l 输出里的 @ 和 + 分别代表什么?怎样查看具体内容?ls -v 与 GNU ls -v 行为有何不同?ls -l 的目录大小判断目录占用的磁盘空间?@ 表示有扩展属性,+ 表示有 ACL;分别用 ls -l@ 和 ls -le 查看。-v 原样打印不可打印字符;GNU 的 -v 是按版本号自然排序。du -sh 统计。
小程序版
微信扫码,随时查命令