通过前面几章我们已经了解了linux下的用户管理,linux的文件类型和目录结构。我们也多次接触了ls命令,ls为list的缩写, 通过ls -al可以列出一个目录中所有文件的详细属性信息,同时也可以查看一个用户对某个文件具有哪些权限。至此我们还没有详细解释ls -al输出中每个字段的含义, 本章我们就来详细了解文件的属性信息。

一.ls命令查看linux文件属性

回到顶部

linux用户对文件的权限(permission)分为读read、写write、执行execute和无权限。其中超级用户root拥有超级权限,对任何文件都具有读写执行的权限。 从文件的角度来讲,linux用户又分为三种,分别是文件拥有者owner、文件所属用户组group、其他用户others。
我们再次运行ls -al命令:

              [peter@initroot ~]$ ls -al
              total 92
              dr-xr-x---. 10 peter peter    4096 Dec 17 19:52 .
              dr-xr-xr-x. 18 peter peter    4096 Aug  6 17:44 ..
              -rw-------   1 peter peter   14663 Jan  2 14:49 .bash_history
              ...省略...
              -rw-r--r--.  1 peter peter     100 Dec 29  2013 .cshrc
              -rwxrw-r--   3 peter initroot 4096 Dec 17 19:52 backup.sh
              ...省略...
            
我们以backup.sh文件讲解各字段的含义. 每个文件信息占用一行,共有七个字段,这七个字段的意义非常重要!需要牢记.各字段含义如下所示:
文件类型与权限 文件硬链接计数 文件所有者 文件所属用户组 文件大小 文件时间 文件名
                -rwxrw-r--   3 peter initroot 4096 Dec 17 19:52 backup.sh
              

1.文件类型与权限

文件类型与权限字段共有十个字符,第一个字符为文件类型属性,表示文件的类型。我们在上一篇文章中已经介绍过文件类型,这里总结如下:
-表示该文件为普通文件(regular file);
d表示该文件为目录(directory);
l表示该文件为指向其他文件的链接文件(link);
b表示该文件为可随机访问的块设备文件(block);
c表示该文件为只能按照字符顺序访问的字符设备文件(character);
s表示该文件为用于数据传输的socket文件(socket);
p表示该文件为用于先进先出方式数据传输的fifo文件(fifo);
剩下的九个字符rwxrwxrwx为文件权限属性,文件的权限包括读(r)、写(w)、执行(x)和无(-)权限。 九个权限字符每三个为一组,分别表示读写执行。每一组都是r、w、x和-字符的组合,r表示读权限,w表示写权限,x表示执行权限,-表示无权限。共分为三组。 第一组表示文件拥有者(owner)的权限; 第二组表示文件所属用户组(group)的权限,即不是文件的拥有者但是却在文件所属用户组中的用户的权限; 第三组表示其他用户(other)的权限; 如果没有权限,相应的权限位就会用-号代替。
我们以上面输出中的backup.sh文件为例:
              -rwxrw-r--   3 peter initroot  4096 Dec 17 19:52 backup.sh
              
该文件的文件类型与权限字段为-rwxrw-r--,为了方便观察,我们用中括号加以区分[-][rwx][rw-][r--]。
第一个字符为-,表示该文件为一个普通文件。
后面每三个字符为一组:
第一组为rwx,表示文件的拥有者对该文件具有读写和执行权限;
第二组为rw-,表示文件所属用户组对该文件具有读和写权限,但是没有执行权限;
第三组为r--,表示其他用户对该文件只有读权限,没有写和执行权限。
注意这里的可执行权限位x,x表示文件可以被执行,相应的用户具有执行该文件的权限.但是文件能不能被成功执行还要取决于文件的内容, 只有二进制可执行文件和脚本文件(例如shell脚本)才能被执行.普通的文本文件,即使可执行权限位设置了x,但是很明显该文件也是无法被执行的, 因为文件中没有可以被执行的计算机程序代码.
我们能够顺利的执行linux系统的命令,是因为命令相对应的二进制可执行文件都设置了可执行权限x. 我们经常会从网络上下载可执行程序文件,但是有时候下载下来了却无法执行,这时候就要查看一下下载的可执行文件是否具备可执行权限属性.
另外x对文件和目录的意义也有所不同.如果文件是目录,并且设置了x位,表示相应的用户可以通过cd命令进入该目录.如果要想往该目录中创建新文件,就看要有没有写权限. 关于目录的可执行权限,我们后面还会做更详细的介绍.这里先大概了解一些基本的内容即可.
那么该文件的所有者和所属用户组是谁呢?我们接着往下看后面的字段。

2.文件硬链接计数

文件链接分为硬链接和软链接,该字段为文件的硬链接计数。 文件硬链接计数字段表示有多少个链接文件链接到本文件的i-node节点。 每个文件都会将他的权限与属性记录到文件系统的i-node中,每个文件对应一个i-node节点!该属性字段记录的就是有多少不同的文件名连结 到同一个inode。
关于i-node的更多信息参考: linux磁盘与文件系统管理

3.文件所有者

表示该文件的拥有者账号,文件拥有者都是在/etc/passwd文件中记录的合法用户账号,例如backup.sh文件的所有者为peter。

4.文件所属用户组

文件所属用户组必须是在/etc/group文件中记录的合法用户组,这个文件所属用户组比较容易造成理解上的混乱。 在linux下,每个用户可能会加入不止一个用户组,每个用户组内包含至少一个用户.文件所属用户组的作用是用来规定不是文件拥有者但是加入到该用户组中的用户对该文件的权限。
例如backup.sh文件的所属用户组为initroot。
了解了以上几个字段,我们现在可以对一个文件的权限做一个全面的分析了,我们还是以上面的backup.sh文件为例进行说明:
              -rwxrw-r--   3 peter initroot  4096 Dec 17 19:52 backup.sh
              
按照上面的讲解,backup.sh是一个普通文件,该文件的拥有者为peter,peter对该文件的权限属性为rwx,即peter用户对该文件拥有读写执行权限。 文件的所属用户组为initroot,我们假设系统中有个用户为cristina,cristina不是该文件的拥有者,但是却加入了initroot用户组中, 那么cristina对该文件的权限属性就是rw-了,即cristina用户对该文件具有读写权限,但是没有执行权限。 最后,如果某个用户既不是peter,也没有加入initroot用户组,那么对backup.sh文件来说,该用户就是other用户了,对该文件的权限属性就是r--,只有读权限,没有写和执行权限。
注意如果一个用户既是文件的拥有者,也加入了文件所属用户组,那么该用户拥有的是文件所有者的权限。

5.文件大小

该字段表示文件所占的磁盘容量大小,默认单位为字节byte,ls命令可以加上-h选项,以k,m,g等单位显示文件大小,更易于用户阅读。

6.文件时间

文件时间字段表示文件的创建日期或者最后修改日期。该字段以月 日 时:分格式显示时间。如果这个文件被修改的时间距离现在太久,超过了今年, 那么时:分部分仅显示年份.如果想要显示完整的时间格式,可以加上--full-time选项:ls -al --full-time就能够显示出完整的时间格式了!包括年、月、日、时间。
touch命令用于修改文件时间,关于文件时间属性的详细内容我们稍后讲解。

7.文件名

该字段就是文件名了。有些文件名的前面有一个点.,文件名以.开头的文件表示该文件是隐藏文件,例如上面的ls -al命令的输出中就有很多隐藏文件. 如果ls命令没有-a选项,这些隐藏文件是不会被显示的. 特别要注意的是两个特殊的隐藏文件.和.., 其中.表示当前目录, ..表示上一级目录.

Linux文件名的限制

linux下的文件名大多由字母,数字,下划线组成.在命名文件的时候,文件名尽量避免出现特殊字符,例如:* ? > < ; & ! [ ] | \ ' " ` ( ) { }. 因为这些特殊字符在shell命令行模式下都有特殊的意义.如果文件名前面加上一个.则表示该文件为隐藏文件. 另外在命令行模式下,命令的选项前面经常会有一个-或者+,所以文件名也应该尽量避免使用-或者+号.
另外,linux对文件名的长度也有所限制.在Linux下,文件名长度取决于所用的文件系统. 传统的Ext2/Ext3/Ext4文件系统和最近被CentOS 7用作默认文件系统的xfs对文件名的长度限制为:
单一文件或目录的最大文件名长度为255bytes,以一个ASCII英文占用一个bytes来说,则大约可达255个字符长度。 假如每个中文字占2bytes, 文件名最大长度约为128个中文字符!

Linux文件扩展名

Linux中的文件是没有扩展名这个概念的.我们通过上面的ls -al输出可以看出,linux文件类型不是通过文件扩展名区分的,而是通过文件属性字段区分. 这个和Windows下的情况有所不同! 在Windows下,通过文件的后缀扩展名来区分文件的类型,比如.exe, .bat, .doc等等,而linux下并不需要通过后缀扩展名来区分. 虽然linux系统内部并不通过后缀扩展名来区分文件类型,但是,我们依然可以在文件名后面加上扩展名来帮助我们区分文件的类别和用途, 也就是说在linux下的文件扩展名对linux是没有意义的,但是对用户是有意义的.
所以, 通常我们还是会以适当的扩展名来表示该文件是什么种类的。我们经常用的文件扩展名有:
*.sh: 脚本或批处理文件(scripts),因为批处理文件为使用shell写成的,所以扩展名就写成.sh了;
*Z, *.tar, *.tar.gz, *.zip, *.tgz: 经过打包的压缩文件。这是因为压缩软件分别为gunzip, tar等等的,根据不同的压缩软件,取相关的扩展名!
*.html, *.php:网页相关文件,分别代表HTML语法与PHP语法的网页文件! .html 的文件可使用网 页浏览器来直接开启,至于.php的文件, 则可以透过client端的浏览器来server端浏览,以得到运算后的网页结果呢!
更详细的ls用法,可以使用ls --help或man ls或info ls等命令查询.

ls命令用于列出文件或者目录的信息,ls默认情况下以字母顺序列出文件或者目录。
linux下的设备和目录都已文件的形式存在,所以以下所述的文件即表示我们平时所说的普通文件,也表示目录和特殊文件。
ls只能列出非隐藏文件的文件名,如果想列出更详细的文件信息,可以加上-l选项,加上-a选项可以将包括隐藏文件在内的所有文件都显示出来,
一般在应用的时候,是将两个选项放在一起使用。如果ls后面没有跟文件名,则表示列出当前工作目录中的文件信息。

              列出当前目录下所有文件:
              [peter@initroot ~]$ ls
              adtest.png  linuxsource  sitemap.txt  tovimplugin  vimplugin
              列出当前目录下文件的详细信息:
              [peter@initroot ~]$ ls -l
              total 44
              -rw-r--r-- 1 peter peter 20752 Oct 10 14:11 adtest.png
              drwxr-xr-x 4 peter peter  4096 Oct 10 14:09 linuxsource
              -rw-r--r-- 1 peter peter 10569 Oct 10 14:11 sitemap.txt
              lrwxrwxrwx 1 peter peter     9 Oct 10 14:11 tovimplugin -> vimplugin
              drwxr-xr-x 2 peter peter  4096 Oct 10 14:12 vimplugin
              列出当前目录下包括隐藏文件在内所有文件的详细信息:
              [peter@initroot ~]$ ls -al
              total 52
              drwxr-xr-x 4 peter peter  4096 Oct 10 14:15 .
              drwxr-xr-x 9 peter peter  4096 Oct 10 14:07 ..
              -rw-r--r-- 1 peter peter 20752 Oct 10 14:11 adtest.png
              drwxr-xr-x 4 peter peter  4096 Oct 10 14:09 linuxsource
              -rw-r--r-- 1 peter peter 10569 Oct 10 14:11 sitemap.txt
              -rw-r--r-- 1 peter peter     0 Oct 10 14:15 .ssh
              lrwxrwxrwx 1 peter peter     9 Oct 10 14:11 tovimplugin -> vimplugin
              drwxr-xr-x 2 peter peter  4096 Oct 10 14:12 vimplugin
            

第1字段:
文件属性字段,该字段由10个字母组成,第一个字母表示文件类型;如果该字母是一个'-'号,说明该文件是一个普通文件; 字母”d”表示该文件是一个目录,字母”d”,是dirtectory(目录)的缩写。
第2-4位表示该文件属主拥有的权限;
5~7位表示和这个文件属主所在同一组的用户所有的权限;
第8~10位表示其它用户所具有的权限
第2字段:
文件硬链接数或者目录子目录数
第3字段:
文件所有者
第4字段:
文件所有者所在的组
第5字段:
文件大小
第6字段:
文件创建月份
第7字段:
文件创建日期
第8字段:
文件创建时间
第9字段:
文件名,如果该文件是一个符号链接,那么会有一个“->”箭头符号,后面跟一个它指向的文件
第一字段详解:
以 linux drwxr-xr-x 为例:
第1位表示文件类型。d是目录文件,l是链接文件,-是普通文件,p是管道。
第2-4位表示这个文件的属主拥有的权限,r是读,w是写,x是执行。
第5-7位表示和这个文件属主所在同一个组的用户所具有的权限。
第8-10位表示其他用户所具有的权限。

ls:显示文件或目录。
常用选项:
-a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出);
-A:显示除影藏文件“.”和“..”以外的所有文件列表;
-C:多列显示输出结果。这是默认选项;
-l:与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列;
-F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。 当文件为普通文件时,不输出任何标识符;
-b:将文件中的不可输出的字符以反斜线“”加字符编码的方式输出;
-c:与“-lt”选项连用时,按照文件状态时间排序输出目录内容,排序的依据是文件的索引节点中的ctime字段。与“-l”选项连用时,则排序的一句是文件的状态改变时间;
-d:仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表;
-f:此参数的效果和同时指定“aU”参数相同,并关闭“lst”参数的效果;
-i:显示文件索引节点号(inode)。一个索引节点代表一个文件;
--file-type:与“-F”选项的功能相同,但是不显示“*”;
-k:以KB(千字节)为单位显示文件大小;
-l:以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等;
-m:用“,”号区隔每个文件和目录的名称;
-n:以用户识别码和群组识别码替代其名称;
-r:以文件名反序排列并输出目录内容列表;
-s:显示文件和目录的大小,以区块为单位;
-t:用文件和目录的更改时间排序;
-L:如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录;
-R:递归处理,将指定目录下的所有文件及子目录一并处理;
--full-time:列出完整的日期与时间;
--color[=WHEN]:使用不同的颜色高亮显示不同类型的。

二.stat命令查看文件属性

回到顶部

我们前面用ls -al命令列出了文件的详细信息,除了ls命令,也可以用stat命令显示文件的详细属性信息。我们知道文件有各种各样的属性,那么这些属性信息存在哪里呢? 实际上,在linux下,每个文件都对应一个inode节点,文件的所有状态属性信息都存在与之对应的inode节点中。而stat命令可以显示文件inode节点信息。
stat命令常用格式如下:

              [root@initroot ~]# stat [文件或目录]  
            
用stat命令查看~/.bashrc文件的inode节点信息:
              [root@initroot ~]# stat .bashrc
                File: .bashrc
                Size: 3106      	Blocks: 8          IO Block: 4096   regular file
              Device: 801h/2049d	Inode: 2621444     Links: 1
              Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
              Access: 2020-01-09 10:21:42.445470848 +0800
              Modify: 2018-04-09 19:10:28.000000000 +0800
              Change: 2019-11-18 16:56:40.949610564 +0800
              Birth: -
            
stat命令列出的文件信息包括:
1.File:显示文件名;
2.Size:显示文件大小;
3.Blocks:文件使用的数据块总数;
4.IO Block:IO块大小;
5.regular file:文件类型(常规文件);
6.Device:设备编号;
7.Inode:Inode号;
8.Links:链接数;
9.Access:文件的权限;
10.Uid、Gid:文件所有权的Gid和Uid。
11. Access Time:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间
12. Modify Time:简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个时间。
13. Change Time:简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例如文件的链接数,大小,权限,Blocks数。
以上大部分属性信息我们在上面已经介绍过了。可以和ls -al输出的信息进行比较。关于inode和文件系统我们会在 linux磁盘与文件系统管理 中详细介绍。

initroot编辑整理,转载请注明www.initroot.com