给出以下 find 命令和输出
21 $ find . -name foo -ls
80960162 0 -rw-rw-r-- 1 kimelmab ccV983 29 Nov 29 07:28 ./foo
第一个数字是 i 节点号,第三个数字是链接数。但是第二个数字(即零)代表什么?
答案1
-ls
这是块的数量(默认情况下为 1K)。根据texinfo 文档 ( info find -n 'Print File Information'
)中的描述:
-- Action: -ls
True; list the current file in 'ls -dils' format on the standard
output. The output looks like this:
204744 17 -rw-r--r-- 1 djm staff 17337 Nov 2 1992 ./lwall-quotes
The fields are:
1. The inode number of the file. *Note Hard Links::, for how to
find files based on their inode number.
2. the number of blocks in the file. The block counts are of 1K
blocks, unless the environment variable 'POSIXLY_CORRECT' is
set, in which case 512-byte blocks are used. *Note Size::,
for how to find files based on their size.
3. The file's type and file mode bits. The type is shown as a
dash for a regular file; for other file types, a letter like
for '-type' is used (*note Type::). The file mode bits are
read, write, and execute/search for the file's owner, its
group, and other users, respectively; a dash means the
permission is not granted. *Note File Permissions::, for more
details about file permissions. *Note Mode Bits::, for how to
find files based on their file mode bits.
...
答案2
在我看来,输出中的第二列
find -ls
是以千字节为单位的驱动器空间占用,[至少对于文件而言] 对应于 的输出du
(默认匹配du -k
)。对于目录,它是目录结构本身占用的驱动器空间(不包括目录中文件中的数据,但包括文件的地址,因此当目录中有许多文件时,数字会增加)。
请注意,在当前的 Ubuntu 系统中,分配给文件的最小驱动器空间为 4 kibibytes。
答案3
不,回答第二个字段是什么,特别是因为其他两个答案已经很好地涵盖了这一点@sudodus和@steeldriver,而是关于其报告的0
块值以及它与第七个字段及其值的关系,29
该值是报告的文件大小(以字节为单位),特别是关于文件如何报告为29
字节大小,但报告的已用块仍然为0
(指出@sudodus 的评论)... 因为文件的正常行为是,当文件为空时,磁盘上使用零个块;当文件包含数据时,至少使用一个块,无论数据的大小与块的大小相比有多小(参见更多解释这里):
## Get filesystem info:
$ stat -f .
File: "."
ID: ea0dd13726e1c7f1 Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 239946508 Free: 140401510 Available: 128194458
Inodes: Total: 61022208 Free: 59882281
$
## Create an empty normal file an examine it with "find"'s action "-ls"
$ touch file1
$
$ find . -name "file1" -ls
20578311 0 -rw-rw-r-- 1 ubuntu ubuntu 0 Nov 30 11:22 ./file1
$
## Write some data into the file and examine it again
$ printf '%s' "1" >> file1
$
$ find . -name "file1" -ls
20578311 4 -rw-rw-r-- 1 ubuntu ubuntu 1 Nov 30 11:26 ./file1
... 对此可能有一些解释如下(这些是其中一些和不是所有可能性):
在 Ubuntu 当前默认文件系统 EXT4 和默认 4K 块大小下
该文件可能是一个疏文件...(在支持它的文件系统上)这些文件的内容是在运行时读取文件时由文件系统动态生成的:
## Get filesystem info:
$ stat -f .
File: "."
ID: ea0dd13726e1c7f1 Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 239946508 Free: 140401510 Available: 128194458
Inodes: Total: 61022208 Free: 59882281
$
## Create a sparse file of "29" bytes size and examine:
$ truncate -s 29 file2
$
$ find . -name "file2" -ls
20578315 0 -rw-rw-r-- 1 ubuntu ubuntu 29 Nov 30 11:30 ./file2
$
## Increase the size of the sparse file and examine again:
$ truncate -s 1G file2
$
$ find . -name "file2" -ls
20578315 0 -rw-rw-r-- 1 ubuntu ubuntu 1073741824 Nov 30 11:32 ./file2
在其他文件系统下
可能允许在磁盘上分配小于完整块大小的空间...例如 NTFS:
## NTFS filesystem:
$ stat -f .
File: "."
ID: 0 Namelen: 255 Type: fuseblk
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 1048575 Free: 1043189 Available: 1043189
Inodes: Total: 4205524 Free: 4205505
$
$
$ touch file
$
$ find . -name "file" -ls
64 0 -rwxrwxrwx 1 root root 0 Nov 30 11:59 ./file
$
$ printf '%s' "1" >> file
$
$ find . -name "file" -ls
64 1 -rwxrwxrwx 1 root root 1 Nov 30 12:01 ./file
$
$ head -c 29 /dev/zero > file
$
$ find . -name "file" -ls
64 1 -rwxrwxrwx 1 root root 29 Nov 30 12:03 ./file
$
$ head -c 1k /dev/zero > file
$
$ find . -name "file" -ls
64 4 -rwxrwxrwx 1 root root 1024 Nov 30 12:03 ./file
... 除 NTFS 之外的其它文件系统可能允许比这更少的数据,即少于 1K 所需的find
操作-ls
来报告为1
。