5.2.6 ls:显示目录下内容及属性信息的命令
5.2.6 ls:显示目录下内容及属性信息的命令
【命令星级】 ★★★★★
【功能说明】
ls命令可以理解为英文单词List的缩写,其功能是列出目录的内容及其内容属性信息(list directory contents)。该命令有点类似于DOS系统下的dir命令,有趣的是Linux下其实也有dir命令,但我们更习惯使用ls。
【语法格式】
ls [option] [file]
ls [选项] [<文件或目录>]
说明:
1)ls命令以及后面的选项和文件,每个元素之间都至少要有一个空格。
2)命令后面的选项和目录文件可以省略,表示查看当前路径的文件信息。
【选项说明】
表5-9针对ls命令的参数选项进行了说明。
表5-9 ls命令的参数选项及说明
【应用范例】
在开始范例讲解之前,先做一些准备,顺便整合一下使用前面的命令。准备代码如下:
[root@oldboy ~]# mkdir /test #<==在根“/”下创建一个目录test。
[root@oldboy ~]# cd /test/ #<==切换到/test目录下。
[root@oldboy test]# touch file1.txt file2.txt file3.txt #<==批量创建若干文件。
[root@oldboy test]# mkdir dir1 dir2 dir3 #<==批量创建多个目录,每个目标目录名两端要
有空格。
[root@oldboy test]# tree #<==显示前面创建的文件及目录结构。
.
├── dir1
├── dir2
├── dir3
├── file1.txt
├── file2.txt
└── file3.txt
3 directories, 3 files
范例5-21:直接执行ls命令,不带任何参数。
[root@oldboy test]# ls #<==不加参数的结果,显示所有文件和目录
dir1 dir2 dir3 file1.txt file2.txt file3.txt
范例5-22:使用-a参数显示所有文件,特别是隐藏文件。
[root@oldboy test]# touch .file4.txt #<==再创建一个隐藏文件,在Linux系统中以“.”
(点号)开头的文件就是隐藏文件。
[root@oldboy test]# ls
dir1 dir2 dir3 file1.txt file2.txt file3.txt
[root@oldboy test]# ls -a
. .. dir1 dir2 dir3 file1.txt file2.txt file3.txt .file4.txt
#<==说明:加了-a参数,就会把以“.”(点号)开头的内容显示出来。这里显示的第一个点号,表示当前目录,即test目录本身,而两个点号表示当前目录的上级目录,此处就是代表根目录。有关一个点、两个点的知识,在8.2.3节的ln命令中会有详细讲解。
[root@oldboy test]# ls -A #<==列出所有文件,包括隐藏文件,但不包括“.”与“..”这两个目录。
dir1 dir2 dir3 file1.txt file2.txt file3.txt .file4.txt
范例5-23:使用-l参数显示详细信息。
[root@oldboy test]# ls -l #<==此处时间属性列默认显示的是文件的最后一次修改时间。
total 12
drwxr-xr-x 2 root root 4096 Oct 25 11:13 dir1
drwxr-xr-x 2 root root 4096 Oct 25 11:13 dir2
drwxr-xr-x 2 root root 4096 Oct 25 11:13 dir3
-rw-r--r-- 1 root root 0 Oct 25 11:13 file1.txt
-rw-r--r-- 1 root root 0 Oct 25 11:13 file2.txt
-rw-r--r-- 1 root root 0 Oct 25 11:13 file3.txt
#<==说明:这个“-l”参数是最常用的参数,意思是用长格式列出目录下的文件类型、权限,连接数、属主(组)及创建修改时间的信息。这里的每个列的属性含义都需要熟练掌握,后文会详细讨论这些属性信息。
可能有人已经注意到了,创建或修改时间的格式没有年份的信息,那么如何显示时间的全部信息呢?见范例5-24。
范例5-24:显示完整时间属性的参数--time-style=long-iso。
[root@oldboy test]# ls -l --time-style=long-iso #<==以long-iso方式显示时间,
这个命令结果是非常棒的。
total 12
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir1
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir2
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir3
-rw-r--r-- 1 root root 0 2015-10-25 11:13 file1.txt
-rw-r--r-- 1 root root 0 2015-10-25 11:13 file2.txt
-rw-r--r-- 1 root root 0 2015-10-25 11:13 file3.txt
#<==提示:这样的时间格式是不是看起来总是让人心情舒畅呢?--time-style的其他可选参数请大家自行测试。
对于上面的命令,说明如下。
1)--time-style包含的可选参数值有:full-iso、long-iso、iso、locale。默认值是locale。
2)在生产场景中经常会遇到同一目录下文件及目录时间的显示不一致的问题,所以需要用ls-l--time-style=long-iso来进行调整,如果觉得参数太多不好记,则可以设置一个别名来进行管理,详见后文的alias命令。
3)值得一提的是,执行ls-l等命令时,默认显示的是文件最后一次修改的时间(如果是新文件就是创建时间)。
4)ls--full-time用于显示完整的时间,等同于ls-l--time-style=full-iso。
既然ls-l输出结果的时间属性列为修改时间,那么能否改成其他的时间呢?例如,显示最后一次文件访问的时间。这当然是可以的,见下文。
范例5-25:执行ls命令,带显示内容的访问时间属性的参数。
[root@oldboy test]# stat file1.txt #<==显示文件的属性及状态信息,stat命令后文会详细
讲解,暂时不用理会。
File: `file1.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 802h/2050d Inode: 271005 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2015-10-25 11:13:38.875401372 +0800 #<==这里就是文件的访问时间,是我们现在
需要关注的。
Modify: 2015-10-25 11:13:38.875401372 +0800
Change: 2015-10-25 11:13:38.875401372 +0800
[root@oldboy test]# date #<==查看当前的系统时间。
Sun Oct 25 19:44:00 CST 2015
[root@oldboy test]# cat file1.txt #<==查看文件内容即表示访问文件了,cat命令后面会讲,
暂时不用理会。
[root@oldboy test]# stat file1.txt #<==重新查看文件的访问时间。
File: `file1.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 802h/2050d Inode: 271005 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2015-10-25 19:44:22.033071250 +0800 #<==我们发现file1.txt的访问时间已经
发生了变化。
Modify: 2015-10-25 11:13:38.875401372 +0800
Change: 2015-10-25 11:13:38.875401372 +0800
[root@oldboy test]# ls -l --time-style=long-iso --time=atime
#<==增加--time=atime参数,显示访问时间。
total 12
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir1
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir2
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir3
-rw-r--r-- 1 root root 0 2015-10-25 19:44 file1.txt #<==文件的时间列确实发生了变化,
是前面的访问时间无疑。
-rw-r--r-- 1 root root 0 2015-10-25 11:13 file2.txt
-rw-r--r-- 1 root root 0 2015-10-25 11:13 file3.txt
[root@oldboy test]# ls -l --time-style=long-iso
total 12
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir1
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir2
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir3
-rw-r--r-- 1 root root 0 2015-10-25 11:13 file1.txt #<==这里是文件的默认修改
时间列。
-rw-r--r-- 1 root root 0 2015-10-25 11:13 file2.txt
-rw-r--r-- 1 root root 0 2015-10-25 11:13 file3.txt
#<==通过以上实践,我们可以得出结论了。--time=atime显示的确实是访问时间,而非默认的修改时间。
对于上面的命令,说明如下。
1)与之相关的命令还有ls-l--time-style=long-iso--time=ctime,用于显示文件的改变时间。
2)有关文件时间列及mtime、atime、ctime的知识,前文在介绍touch命令时已经讲解过了。
范例5-26:执行ls命令,带-F参数(有些类似于tree命令的-F)。
[root@oldboy test]# ls -F
dir1/ dir2/ dir3/ file1.txt file2.txt file3.txt
#<==说明:加了-F之后,我们可以清晰地看到所有目录的结尾都加上了斜线/。这样的功能对于工作有什么用呢?当然有用了,例如,我们要过滤出所有的目录来,那么只需要将带斜线的过滤出来就可以了。
[root@oldboy test]# ls -F|grep / #<==过滤目录,grep命令的具体用法见后面grep章节。
dir1/
dir2/
dir3/
[root@oldboy test]# ls -F|grep -v / #<==过滤普通文件。
file1.txt
file2.txt
file3.txt
#<==说明:ls的-F参数是在文件结尾加上文件类型指示符号(*、/、=、@、|,其中的一个)。
范例5-27:使用-d参数只显示目录本身的信息。
有时候我们想查看目录本身的信息,但是若使用“ls目录”命令,就会显示目录里面的内容。示例代码如下:
[root@oldboy test]# ls -l dir1 #<==这样根本无法查看dir1目录本身的信息,除非到上级
目录中查看。
total 0
如果只是想显示目录本身的信息,那么这个时候参数-d就能派上用场了,示例代码如下:
[root@oldboy test]# ls -ld dir1 #<==加-d参数就可以如愿以偿了。
drwxr-xr-x 2 root root 4096 Oct 25 11:13 dir1
范例5-28:使用-R参数递归查看目录。
[root@oldboy test]# mkdir dir1/sub1/test -p #<==递归创建目录的命令。
[root@oldboy test]# ls -R dir1 #<==类似于tree但没有tree好用的方法。
dir1:
sub1
dir1/sub1:
test
dir1/sub1/test:
范例5-29:ls命令别名的相关知识及设置ls别名。
可通过如下命令查看ls在系统中的默认别名设置,执行等号前面的内容就会调用后面的命令:
[root@oldboy test]# alias|grep ls #<==alias命令的用法请参见相应的alias章节。
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
#<==提示:什么是别名呢?别名很好理解,就是另外一个名字而已。
例如,显示时间格式的参数太长,这里就可以做个别名,示例代码如下:
[root@oldboy test]# alias lst='ls -l --time-style=long-iso' #<==配置命令别名。
[root@oldboy test]# alias |grep lst #<==检查命令别名是否生效。
alias lst='ls -l --time-style=long-iso'
[root@oldboy test]# lst #<==执行命令别名,检查效果。
total 12
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir1
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir2
drwxr-xr-x 2 root root 4096 2015-10-25 11:13 dir3
-rw-r--r-- 1 root root 0 2015-10-25 11:13 file1.txt
-rw-r--r-- 1 root root 0 2015-10-25 11:13 file2.txt
-rw-r--r-- 1 root root 0 2015-10-25 11:13 file3.txt
#<==注意:这里的别名是临时生效的,如果希望永久生效则需要将别名放到环境变量的配置里才可以。
范例5-30:查找最近更新过的文件。
在工作中,我们经常需要查看一个包含很多文件的目录,找出最近更新过但不知道具体文件名的文件,这时可以用ls-lrt或者ls-rt这个组合命令,示例代码如下:
[root@oldboy test]# touch /etc/test.txt #<==创建一个新文件,假设不知道名字,你如何
快速找到它?
[root@oldboy test]# ls -lrt /etc/ #<==-t是按时间排序,-r是倒序,即按时间倒序
排序。
...省略若干文件行...
-rw-r--r-- 1 root root 301 May 22 10:17 mtab
drwxr-xr-x 9 root root 4096 May 22 10:22 sysconfig
-rw-r--r-- 1 root root 0 May 22 20:55 test.txt
#<==不用翻屏回查,最后一屏的最后一行就是我们需要查找的文件。如果直接定位文件还可以用如下命令。
[root@oldboy test]# ls -lrt /etc|tail -1 #<==tail命令后面会讲。
-rw-r--r-- 1 root root 0 May 22 20:55 test.txt
【ls命令输出内容的属性解读】
使用ls命令之后,通常会有类似如下的输出内容:
[root@oldboy test]# ls -lhi #<==-l参数前面已经详细讲解过了,-h参数的作用是将文件的
大小以人类可读的方式显示,像下面的4.0K你就能很容易
知道文件的大小,-i参数的作用是显示文件的Inode值。
total 12K
97063 drwxr-xr-x 3 root root 4.0K May 22 20:48 dir1
97064 drwxr-xr-x 2 root root 4.0K May 22 11:51 dir2
97065 drwxr-xr-x 2 root root 4.0K May 22 11:51 dir3
97060 -rw-r--r-- 1 root root 0 May 22 11:51 file1.txt
97061 -rw-r--r-- 1 root root 0 May 22 11:51 file2.txt
97062 -rw-r--r-- 1 root root 0 May 22 11:51 file3.txt
上述命令结果中各列的含义如下。
第一列:Inode索引节点编号。
第二列:文件类型及权限(第一个字符为类型,后9个字符为文件权限符号)。
第三列:硬链接个数(详情请参看ln命令(8.2.3节)的讲解)。
第四列:文件或目录所属的用户(属主)。
第五列:文件或目录所属的组。
第六列:文件或目录的大小。
第七、八、九列:文件或目录的修改时间。
第十列:实际的文件名或目录名。
详细解释见图5-3。
【ls输出的文件属性举例说明】
下面以oldboy文件为例说明输出文件的属性细节(具体见表5-10),具体列的内容请参考图5-3。
1736707 -rw-r--r-- 1 root root 35 Oct 28 11:29 oldboy
图5-3 ls命令输出内容的属性解读
表5-10 ls输出的文件属性细节说明