一文讲清楚ls命令的排序

数据智能相依偎 2024-09-08 01:55:49

背景

在《轻松完全掌握Linux的ls命令-显示篇》中介绍了ls命令关于显示方面的知识。因为篇幅太长,将排序部分单独城篇,便于阅读。本文来分享ls关于排序方面的实用知识。

分析

排序是查看文件的一个重要的手段,对于文件较多的情况,一个无序的列表会让阅读成本很高,很容易漏看。排序之后,只要按照顺序去找,可以极大缩小寻找范围,就可以确定文件是否存在。查找的效率变高,漏看基本上很少会发生,除非你心不在焉做到视而不见。

默认情况下,ls命令会按字母顺序(ASCII码值)对文件和目录进行排序。这种排序方式是基于文件名的字典序排列,即从A到Z(大写字母在小写字母之前),数字在字母之前。

说到排序,就要知道有正序和倒序。默认情况是正序。

1.-r倒序排序

r即reverse,相反的意思。默认是正序,相反即倒序。

2.排序字段

除了正序倒序外,还要了解排序字段。默认情况下,排序是按照文件名进行排序的。

单纯对于ls来说,排序也就只是对文件名来说的,知道正序倒序也就够了。

而对于ls -l来说,就大不一样了。因为-l参数列出来了很多列,很多列都可以进行排序。这个和Windows里每一列都可以排序是一个道理。

ls命令本身支持一般只有文件名、文件大小、时间、文件版本号、后缀名等排序。如果需要对其他列进行排序,则需要借助sort命令了。

3.如果不希望有任何排序

在ls不加任何参数的情况下,会使用文件名作为默认排序字段。如果你不希望排序显示,则可以禁止排序。禁止排序后,则直接按照文件系统存储的顺序进行排序。这样我们可以了解到文件系统的存放文件的顺序的情况。

可以看到,ls默认进行了文件名排序。而-f则看起来很凌乱,也把隐藏文件显示出来了。为什么-f后的显示很乱呢?因为文件系统存储文件有一个算法,保证文件记录尽可能多存储,同时还会有删除后释放的位置,基于一个算法来安排新的文件的索引的位置。所以看到的文件列表是没有规律的。

-f参数有什么作用呢?平常似乎用不到的样子。基于-f禁止排序的作用,我们可以用来研究文件系统的存储情况的反应,借以了解磁盘的存储状态。当然这个是比较专业的人需要用到的,比如研发新的存储方式,优化存储效率,优化检索效率等等程序。

对于日常使用来讲,在一个目录存储了各种各样的文件,数量巨大,使用-f则可以加快列出来的速度。因为不再需要排序,直接按照文件系统的存储顺序依次读取出来即可。而使用排序的话,读出来之后还要执行排序再返回,当数量很大,顺序杂乱时,排序还是要点时间的。当你在列出一个目录列表时感觉很卡时,可以试试-f参数哦。

4.文件名排序

对于文件名排序,前面已经提到了,就是默认的排序,按照字典的顺序排序。不过文件名排序还有一点需要了解的。熟悉之后,对后续使用挺有帮助的。

-v按照文件版本号排序:

默认情况下,排序是以文件名按照字典顺序排序。可以看到,10是紧随着1之后的。而10按照预期应该是在9之后的。

此时就需要按照版本号排序。版本号是文件名的一部分,不限制在开头或结尾,只要碰到数字字符,就按照数字字符的数字大小进行排序,这样就可以确保10在9之后。比如当我们在备份文件时,使用版本号管理,这个排序就很有用。

使用-v排序后,是不是就舒服多了。

-x按照扩展名排序:

在windows中,按照扩展名排序是很常用。

Linux这么强大,也不能落下。

通过-X排序后,后缀名按类型排在一起了。

5.-S按照文件大小排序

按照文件大小排序,就太常用了。-S 即Size大小的意思。使用-S可以无视文件大小显示的单位,会自动按照正确的大小排序。加上-h后可以更直观。

6.按照时间排序

时间排序也是太常用了。这里的时间指的是文件相关的时间,需要介绍一下。

在许多Linux发行版和Unix系统中,ls命令本身并不直接支持显示文件的创建时间。这是因为大多数文件系统(如常见的ext4、XFS等)并不在文件元数据中存储创建时间,而是存储了修改时间、访问时间和状态改变时间。

排序也只能针对文件修改时间、文件访问时间和文件状态改变时间。文件修改时间即默认ls -l显示的时间。访问时间要使用-u参数来指明,状态改变时间要使用-c来指明。如果要按照时间排序,要加-t参数。

查看一下访问时间:

可以看到,开始查看文件2的访问时间为11:20,当我使用cat查看2的内容后,再看访问时间,已经更新为14:16了。

在Unix和类Unix系统中,文件的访问时间(atime, access time)是指文件最后一次被读取或访问的时间。这个时间戳记录了文件上次被读操作影响的时刻。

以下是一些典型会更新文件访问时间的操作:

读取文件内容:无论是使用命令行工具(如cat、less等)还是通过程序读取文件,都将更新文件的访问时间。

执行文件:如果该文件是一个可执行文件,当它被执行时,也会更新访问时间。

访问文件属性:某些情况下,访问文件的元数据也可能更新访问时间,具体取决于系统的配置。

查看一下文件状态时间:

当对文件的权限信息进行修改后,状态时间也变化了。

在Unix和类Unix系统中,文件的状态改变时间(ctime)会在以下情况下发生变化:

修改文件内容:当文件的内容被修改后,文件的状态改变时间会更新。

修改文件属性:包括文件的权限、所有者、所属组等属性的修改都会导致状态改变时间更新。

修改文件链接:如果文件的链接数发生变化,状态改变时间也会相应更新。

移动或重命名文件:对文件进行移动或重命名操作也会更新状态改变时间。

对时间进行排序,需要加上-t参数,然后加上-u(访问时间)或-c(状态修改时间)或不带(文件最后修改时间)。按照时间排序时最近的时间在最上面。

按照最后修改时间排序:

按照最后访问时间排序:

按照最后修改的文件状态时间排序:

最后,如何来记住这三种时间参数了,如果不加强理解记忆,一段时间后就忘记混淆了。

对于一个文件时间我们最关注的,也就作为默认的。我们会关注什么呢?当然是修改时间。因为对于内容的修改是最敏感的。我们通过最后修改时间,来确定文件是不是被动过,以免被改乱了,或者是旧版本文件。这个是我们最有必要关心的。文件的核心就是它的内容,内容变没变是我们最关心的。

而文件状态(属性的修改),不影响内容,这个虽然有一定的参考价值,但是频率小多了。当我们改了权限,我们忘记时间了,可以看看什么时候改的,但是不影响内容的正常查看。要看权限修改时间的场景很少。况且,文件状态很容易变,修改文件会变、修改属性、修改权限等等都会变,时间久了你也不知道它修改的是哪个属性,也没有太大的参考价值了。在Linux的系统中,对于文件状态时间的描述的是ctime,即change time,即改变时间。我们常说对文件的内容的修改,那是操作内容。这里的改变仅仅是改变文件属性,不涉及到文件内容。当然,内容修改了,也会导致属性变化。所以c参数是change单词缩写得来。这样也就好理解记忆了。

而文件的访问时间,虽然在命令行工具中,参数通常并不是严格的缩写,但在这个上下文中,可以认为 -u 与 "update" 相关,因为访问时间会在文件被读取或打开时更新。因此,-u 参数可以理解为是 "update time" 或 "access time" 的代表。文件被打开就更新的时间,就是访问时间。u参数也就是这个含义。

总结

ls排序相对于显示来说,会简单点。显示部分讲述了相关的背景知识,而排序只需要对这些信息进行排序,所以相对简单点。在排序这里,对文件的三种时间描述会比较详细,并且提供一个好理解好记忆的描述,帮助理解记忆。

0 阅读:2

数据智能相依偎

简介:感谢大家的关注