为什么 ls 对某些目录显示不同的大小(不是 4k)?

ran*_*all 6 command-line directory ls

虽然ls显示大多数目录的大小为4.0K,但某些目录具有不同的大小,如下面的输出所示:

drwxr-xr-x 8 root root 4.0K Aug 13  2022 room
drwxr-xr-x 2 root root  138 Jan 11  2021 room_old
drwxr-xr-x 2 root root 4.0K Aug 12  2022 room_new
Run Code Online (Sandbox Code Playgroud)

为什么ls某些目录显示不同的大小(不是 4k)?

Raf*_*ffa 6

它实际上并不是目录内容的大小,而是磁盘上有多少空间用于存储该目录的元数据(例如关于它及其直接内容 inode 编号和名称/路径)。

为了简化它,想象一个类似于电话目录的目录……即它包含的姓名、号码和地址越多,它的大小就越大,反之亦然。

请看下面的演示:

# Block size
$ stat -fc %s .
4096
# Create empty directories
$ mkdir 1 2 3
$ ls -lh
total 12K
drwxrwxr-x 2 ubuntu ubuntu 4.0K Mar  8 11:43 1
drwxrwxr-x 2 ubuntu ubuntu 4.0K Mar  8 11:43 2
drwxrwxr-x 2 ubuntu ubuntu 4.0K Mar  8 11:43 3
# Create multiple empty 0 size files
$ touch 1/file{1..1000}
$ touch 2/file{1..100000}
# Create a 1G size file
$ fallocate -l 1G 3/file1
$ ls -lh
total 2.7M
drwxrwxr-x 2 ubuntu ubuntu  28K Mar  8 11:44 1
drwxrwxr-x 2 ubuntu ubuntu 2.6M Mar  8 11:44 2
drwxrwxr-x 2 ubuntu ubuntu 4.0K Mar  8 11:44 3
$ du -sh *
28K     1
2.6M    2
1.1G    3
# Copy a more populated directory with larger meta-info size under another less populated directory
$ cp -r 2/ 3/
$ ls -lh
total 2.7M
drwxrwxr-x 2 ubuntu ubuntu  28K Mar  8 11:44 1
drwxrwxr-x 2 ubuntu ubuntu 2.6M Mar  8 11:44 2
drwxrwxr-x 2 ubuntu ubuntu 4.0K Mar  8 11:44 3
$ ls -lh 3/
total 1.1G
drwxrwxr-x 2 ubuntu ubuntu 2.6M Mar  8 11:44 2
-rw-rw-r-- 1 ubuntu ubuntu 1.0G Mar  8 11:44 file1
Run Code Online (Sandbox Code Playgroud)

请注意,目录元数据/信息的最小可分配大小取决于文件系统...例如,在 Ubuntu EXT4上,它默认为块大小(使用例如查找它stat -fc %s .)...但是,其他文件系统可能会使用更少/更多那...例如在NTFS上:

# Block size
$ stat -fc %s .
4096
# Create an empty directory
$ mkdir dir_on_ntfs
$ ls -lh
total 0
drwxrwxrwx 1 ubuntu ubuntu 0 Mar  8 13:32 dir_on_ntfs
# Populate the directory with multiple empty 0 size files
$ touch  dir_on_ntfs/file{1..10000}
$ ls -lh
total 2.0M
drwxrwxrwx 1 ubuntu ubuntu 2.0M Mar  8 13:32 dir_on_ntfs
Run Code Online (Sandbox Code Playgroud)

在XFS上:

# Block size
$ stat -fc %s .
4096
# Create an empty directory
$ mkdir dir_on_xfs
$ ls -lh
total 0
drwxr-xr-x 2 ubuntu ubuntu 6 Mar  8 13:32 dir_on_xfs
# Populate the directory with multiple empty 0 size files
$ touch dir_on_xfs/file{1..10000}
$ ls -lh
total 376K
drwxr-xr-x 2 ubuntu ubuntu 240K Mar  8 13:32 dir_on_xfs
Run Code Online (Sandbox Code Playgroud)

在VFAT上时:

# Block size
$ stat -fc %s .
32768
# Create an empty directory
$ mkdir dir_on_vfat
$ ls -lh
total 32K
drwxr-xr-x 2 ubuntu ubuntu 32K Mar  8 13:32 dir_on_vfat
# Populate the directory with multiple empty 0 size files
$ touch  dir_on_vfat/file{1..10000}
$ ls -lh
total 640K
drwxr-xr-x 2 ubuntu ubuntu 640K Mar  8 13:32 dir_on_vfat
Run Code Online (Sandbox Code Playgroud)