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