文件属性信息
“Linux系统中万物皆文件”,当我们进入家目录并键入命令:
ls -l
终端会输出目录下文件的一些信息。但是在这些信息中,作为小白的我只能看出来,输出中包含时间和文件名,其余的项就不知道代表什么了。
(base) torch@torch:~$ ls -l
total 20
drwxr-xr-x 28 torch torch 4096 Aug 16 16:57 anaconda3
drwxr-xr-x 6 torch torch 4096 Aug 21 13:43 code
drwxrwxr-x 13 torch torch 4096 Nov 18 2022 opencv
drwxr-xr-x 2 torch torch 4096 Mar 18 18:36 proxy
drwxr-xr-x 2 torch torch 4096 May 19 09:17 virtualenv
我们以输出中的第二行为例:
drwxr-xr-x 28 torch torch 4096 Aug 16 16:57 anaconda3
从左到右,字符的意义依次是:
字符 | 意义 |
---|---|
d | 文件类型 |
rwx | 文件所有者权限 |
r-x | 文件所属用户组权限 |
r-x | 其他用户权限 |
28 | 连接数 |
torch | 所属用户 |
torch | 所属用户组 |
4096 | 文件大小 |
Aug 16 16:57 | 文件最新修改日期 |
anaconda3 | 文件名 |
这其中有一些名词需要解释和扩充,我们整理如下
文件类型
其中,我们经常会去操作的是普通文件和目录文件。以后的重心也会放在普通文件和目录文件上。如果对其他文件类型不清楚也没关系,用到的很少。
类型 | 解释 |
---|---|
- | 普通文件 |
d | 目录文件 |
b | 硬盘、光驱等块设备文件 |
c | 光猫、串口设备等字符设备文件 |
l | 链接文件 |
p | 管道文件 |
s | 套接口文件/数据接口文件 |
文件所有者与文件所属用户组
文件所有者默认情况下是文件创建者,所属用户组为文件创建者所属的组。
权限
虽然普通文件和目录文件的权限种类和代表字符相同,但是却代表着不同的含义1。
类型 | 文件权限 | 目录权限 |
---|---|---|
r | 可读 | 可查看目录下的文件 |
w | 可写 | 可以对目录内容进行创建、删除和重命名 |
x | 可执行 | 可以进入目录 |
奇怪的40962
可以看到,我们的目录文件大小都是4096B,但是我们的目录中明明存放了不同的东西,不应该一样大呀?而且这4096B也就是4kb是不是太小了?值得注意的是,我们的目录文件的大小并不表示该目录内所有文件大小的总和,而是该目录的i节点和目录下所有的文件名字符的大小(这么说也不准确,但是可以这么理解)。文件名可以理解,i节点又是啥?这个后面说。总之,目录文件所包含的信息总共就这两部分,其实占不了多大的空间,所以不会像我们在windows中看目录属性那样显示大小有几百兆。但是,即使是这样,也不应该相等,都是4kb呀?这就是另一个问题了,涉及到linux系统文件存取的最小单位——块。这个最小存储单元的存在意味着,linux系统中的文件最小也的是4kb,而我们的目录,i节点占用的空间很小,一般是128B或256B,主要的空间都用在记录文件名上了,只要该目录下的文件名没有多到一定程度,突破了一个块的记录限制,那么这个目录文件的大小就只能是4096B。
i节点
上面一节中,我们有说到目录中包含一个i节点。其实linux系统中的所有文件都有一个i节点(索引节点,index node)。它的具体内容如下:
内容 | 解释 |
---|---|
i节点号 | 在系统中该文件的唯一编号,是系统访问文件的途径 |
文件类型 | —————— |
权限 | —————— |
文件字节数 | —————— |
uid | 文件拥有者 |
gid | 文件所属组 |
文件时间戳 | 包含i节点变动时间、文件内容变动时间、最近一次无变动访问时间 |
硬链接数 | 该文件的别名数量 |
储存位置 | 存放该文件的块的位置 |
可以看到,文件的i节点中并不包含文件名的信息,我们在上一节中也说到过,文件名信息是包含在目录文件中的。i节点是计算机查找文件的途径,文件名只是方便我们人类记忆的符号,那当我们按照文件名去操作文件时,系统是如何将文件名与文件的i节点号对应的呢?
目录文件
我们之前说到,目录文件由i节点和包含的文件名两部分组成,其实目录也可以像普通文件一样被打开。我们在终端中键入以下命令
vim anaconda3/
获得如下输出:
" ============================================================================
" Netrw Directory Listing (netrw v156)
" /home/torch/anaconda3
" Sorted by name
" Sort sequence: [/]KaTeX parse error: Undefined control sequence: \< at position 2: ,\̲<̲core\%(\.\d\+\)…,.c , c ˙ p p ,\.cpp ,c˙pp,~=* , ∗ , o ˙ ,*,\.o ,∗,o˙,.obj , i ˙ n f o ,\.info ,i˙nfo,.swp , b ˙ a k ,\.bak ,b˙ak," Quick Help: :help -:go up dir D:delete R:rename s:sort-by x:special
" ==============================================================================
…/ ./
bin/
compiler_compat/
conda-meta/
condabin/
doc/
envs/
etc/
include/
lib/
libexec/
licensing/
man/
mkspecs/
phrasebooks/
pkgs/
plugins/
qml/
resources/
可以看到,其实这个目录文件中的文字内容就是该目录下所包含的文件名称。而实际上,这些输出已经被vim处理过了,实际的内容不只是文件名,还有文件名所对应的i节点号。文件名与i节点号构成了一个查询列表,当我们通过文件名操作文件时,计算机就可以通过查询列表找到文件的i节点号来完成操作。而这个查询列表就保存在目录文件中。