我正在观察以下行为,并想知道这是否是预期的。
我正在尝试在.拥有的目录上运行磁盘使用情况 ( du
) 。user2
test_directory
user1
如果我更改权限以允许每个人完全访问(使用chmod 777 test_directory
),则user1
和都user2
能够按预期正确查看磁盘使用情况:
但是,如果我限制其他用户的可执行访问权限(使用chmod 776 test_directory
),则user2
无法运行du
并发生权限错误:
此外,在出现错误的情况下,目录显示为 4096 字节大小。
为什么用户需要可执行权限才能使用 du 请求磁盘使用情况?我天真地期望只需要读取权限(即
chmod 774
)。其实看起来两个都运行 du (即 )需要读取和执行权限chmod 775
。为什么在这种情况下目录大小默认为 4096 字节?
谢谢!
答案1
如果没有对 的执行/访问( x
)权限dir
,则无法调用stat()
,dir/foo.bin
也无法看到它有多大。仅具有读取 ( r
) 权限后,您只能列出文件名,但一般情况下您获得的只是名称。
在某些系统中,readdir()
可能会提供比名称更多的信息,但我不确定是否有任何系统可以提供文件大小。 Linux 文件系统可以给出文件类型,该文件类型在 inode 和目录项的生命周期内永远不会改变。但有些东西不断变化,比如大小很难从文件系统中的目录中获取,其中索引节点与目录列表是分开的。
即使你确实得到了 的大小readdir()
,仅仅阅读dir/
也不会得到 的大小dir/sub/bar.bin
,你需要阅读dir/sub
它。如果没有 的访问权限dir
,您就不能。
目录的大小只是文件列表的大小,不包括文件本身的大小。所以它并没有告诉你太多。 4 kB 对于 ext4 来说很常见,它只是一个文件系统块,是文件系统需要分配的最小值。与文件相同,您只需x
对其所在目录的权限即可获取大小。 (例如,您需要x
on才能获得或dir/
的大小。)dir/file.txt
dir/subdir/
所以是的,您需要读取和访问权限才能有效扫描整个目录树。