Linux 命令行完全指南:ls 命令用法详解

ls命令可以理解为英文单词list的缩写,其功能是列出目录的内容及其内容属性信息(list directory contents )。该命令有点类似于DOS系统下的dir命令,主要作用是显示目录下的内容,命令格式如下:

复制
[root@localhost ~]# ls [选项] [文件名或目录名] #命令后面的选项和目录文件可以省略,表示查看当前路径的文件信息1.2.

选项

功能

-a

显示目录下的所有文件,包括以 "." 开头的隐藏文件;

-d,--directory

当遇到目录时,列出目录本身而非目录内的文件,并且不跟随符链接;

-h

以人类可读的信息显示文件或目录大小,如1KB、234MB、2GB等

-q

将文件名中的非打印字符输出为问号。(对于到终端的输出这是缺省的。)

-t

根据最后的修改时间(mtime)排序,默认是以文件名排序;

-u

使用最近访问时间代替最近修改时间为依据来排序(使用“-t”选项时)或列出(使用“-l”选项时)。

-1,--format=single-column

阿拉伯数字1,一行输出一个文件(单列输出)。如标准输出不是到终端,此选项就是缺省选项。

-b,--escape

把文件名中不可输出的字符用反斜杠加字符编号(就象在 C 语言里一样)的形式列出。以八进制溢出序列表示不可打印的字符;

-c,--time=ctime,--time=status

按文件状态改变时间(i节点中的ctime)排序并输出目录内容。如采用长格式输出(选项-l),使用文件的状态改变时间取代文件修改时间。【译注: 所谓文件状态改变(i节点中以ctime标志),既包括文件被修改,又包括文件属性(如所有者、组、链接数等等)的变化】

-t,--sort=time

按文件最近修改时间(i节点中的mtime)而不是按文件名字典序排序,新文件靠前。

-u,--time=atime,--time=access,--time=use

类似选项-t,但是用文件最近访问时间(i节点中的atime)取代文件修改时间。如果使用长格式列出,打印的时间是最近访问时间。

-f

不排序目录内容;按它们在磁盘上存储的顺序列出。同时启动“-aU”选项,如果在“-f”之前存在“-l”、“--color”、“-t”或“-s”,则禁止这些选项。

-g

忽略,为兼容UNIX用。

-i,--inode

在每个文件左边打印i节点号(也叫文件序列号和索引号),i节点号在每个特定的文件系统中是唯一的;

-k,--kilobytes

如列出文件大小,则以千字节KB为单位。

-l,--format=long,--format=verbose

除每个文件名外,增加显示文件类型、权限、硬链接数、所有者名、组名、大小(byte)、及时间信息(如未指明是其它时间即指修改时间)。对于6个月以上的文件或超出未来1小时的文件,时间信息中的时分将被年代取代。每个目录列出前,有一行“总块数”显示目录下全部文件所占的磁盘空间。块默认是1024字节;如果设置了POSIXLY_CORRECT的环境变量,除非用“-k”选项,则默认块大小是512字节。每一个硬链接都计入总块数(因此可能重复计数),这无疑是个缺点。列出的权限类似于以符号表示(文件)模式的规范。但是ls在每套权限的第三个字符中结合了多位(multiplebits)的信息,如下: s如果设置了setuid位或setgid位,而且也设置了相应的可执行位。S如果设置了setuid位或setgid位,但是没有设置相应的可执行位。t如果设置了sticky位,而且也设置了相应的可执行位。T如果设置了sticky位,但是没有设置相应的可执行位。x如果仅仅设置了可执行位而非以上四种情况。-其它情况(即可执行位未设置)。

-m,--format=commas

水平列出文件,每行尽可能多,相互用逗号和一个空格分隔。

-n,--numeric-uid-gid

列出数字化的UID和GID而不是用户名和组名。

-o

以长格式列出目录内容,但是不显示组信息。等于使用“--format=long--no-group”选项。提供此选项是为了与其它版本的ls兼容。

-p

在条目后加上一个字符以说明该文件的类型。类似-F选项但是不标示可执行文件;

-q,--hide-control-chars

用问号代替文件名中非打印的字符。这是缺省选项。

-r,--reverse

依相反次序排序;

-s,--size

在每个文件名左侧输出该文件的大小,以1024字节的块为单位。如果设置了POSIXLY_CORRECT的环境变量,除非用“-k”选项,块大小是512字节。

-w,--widthcols

假定屏幕宽度是cols(cols以实际数字取代)列。如未用此选项,缺省值是这样获得的: 如可能先尝试取自终端驱动,否则尝试取自环境变量COLUMNS(如果设置了的话),都不行则取80。

-x,--format=across,--format=horizontal

多列输出,横向排序(相当于将ll变为ls);

-A,--almost-all

显示除"."和".."外的所有文件;

-B,--ignore-backups

不输出以“~”结尾的备份文件,除非已经在命令行中给出。

-C,--format=vertical

多列输出,纵向排序。当标准输出是终端时这是缺省项。使用命令名dir和d时,则总是缺省的。

-D,--dired

当采用长格式(“-l”选项)输出时,在主要输出后,额外打印一行: //DIRED//BEG1END1BEG2END2...BEGn和ENDn是无符号整数,记录每个文件名的起始、结束位置在输出中的位置(字节偏移量)。这使得Emacs易于找到文件名,即使文件名包含空格或换行等非正常字符也无需特异的搜索。如果目录是递归列出的(“-R”选项),每个子目录后列出类似一行: //SUBDIRED//BEG1END1...【译注: 我测试了TurboLinux3.0和RedHat6.1,发现它们都是在“//DIRED//BEG1...”之后列出“//SUBDIRED//BEG1...”,也即只有一个而不是在每个子目录后都有。而且“//SUBDIRED//BEG1...”列出的是各个子目录名的偏移。】

-F,--classify,--file-type

在每个文件名后附上一个字符以说明该文件的类型;*表示普通的可执行文件;/表示目录;@表示符号链接;|表示FIFOs;=表示套接字(sockets);什么也没有则表示普通文件;

-G,--no-group

以长格式列目录时不显示组信息。

-I,--ignorepattern

除非在命令行中给定,不要列出匹配shell文件名匹配式(pattern,不是指一般表达式)的文件。在shell中,文件名以"."起始的不与在文件名匹配式(pattern)开头的通配符匹配。

-L,--dereference

列出符号链接指向的文件的信息,而不是符号链接本身。

-N,--literal

不要用引号引起文件名。

-Q,--quote-name

用双引号引起文件名,非打印字符以C语言的方法表示。

-R,--recursive

递归列出所有子目录;

-S,--sort=size

按文件大小而不是字典序排序目录内容,大文件靠前;

-T,--tabsizecols

假定每个制表符宽度是cols。缺省为8。为求效率,ls可能在输出中使用制表符。若cols为0,则不使用制表符。

-U,--sort=none

不排序目录内容;按它们在磁盘上存储的顺序列出。(选项“-U”和“-f”的不同是前者不启动或禁止相关的选项。)这在列很大的目录时特别有用,因为不加排序能显著的加快速度。

-X,--sort=extension

按文件扩展名(由最后的"."之后的字符组成)的字典序排序,没有扩展名的先列出;

--color[=when]

指定是否使用颜色区别文件类别。环境变量LS_COLORS指定使用的颜色,when可以被省略,或是以下几项之一:none不使用颜色,这是缺省项;auto仅当标准输出是终端时使用;always总是使用颜色;指定--color而且省略when时就等同于--color=always。

--full-time

列出完整的时间,而不是使用标准的缩写。格式如同date(1)的缺省格式;此格式是不能改变的,但是你可以用cut(1)取出其中的日期字串并将结果送至命令“date-d”。输出的时间包括秒是非常有用的。(Unix文件系统储存文件的时间信息精确到秒,因此这个选项已经给出了系统所知的全部信息。)例如,当你有一个Makefile文件不能恰当的生成文件时,这个选项会提供帮助。

--time-style={full-iso,long-iso,iso,locale}

以不同的时间格式输出,long-iso效果最好;

--time={atime,ctime}

按不同的时间属性输出,atime表示按访问时间,ctime表示按改变权限属性时间,如果不加此参数则默认为最后修改时间;

案例演示:

在开始范例讲解之前,需要先做一些准备,顺便整合一下前面使用的命令:

复制
[root@localhost ~]# mkdir /test [root@localhost ~]# cd /test/ [root@localhost test]# touch file{1..3}.txt [root@localhost test]# mkdir dir{1..3}1.2.3.4.

(1) 直接执行ls命令,不带任何参数;

复制
[root@localhost test]# ls #不加选项的结果,显示所有文件和目录 dir1 dir2 dir3 file1.txt file2.txt file3.txt1.2.3.

(2) 使用-a参数显示所有文件,特别是隐藏文件;

复制
[root@localhost test]# touch .file.txt #再创建一个隐藏文件,再Linux系统中以.开头的文件就是隐藏文件 [root@localhost test]# ls dir1 dir2 dir3 file1.txt file2.txt file3.txt [root@localhost test]# ls -a . .. dir1 dir2 dir3 file1.txt file2.txt file3.txt .file.txt #加了-a选项,就会把以.开头的内容显示出来了。这里显示的第一个点号,表示当前目录,即test目录本身;而两个点号则表示当前目录的上级目录,此处就代表根目录了; [root@localhost test]# ls -A dir1 dir2 dir3 file1.txt file2.txt file3.txt .file.txt #列出所有文件,包括隐藏文件,但不包括...这两个目录1.2.3.4.5.6.7.8.9.10.

(3) 使用-l参数显示详细信息;

复制
[root@localhost test]# ls -l #此处的时间属性列默认显示的是文件的最后一次修改时间 total 0 drwxr-xr-x. 2 root root 6 Jan 21 15:39 dir1 drwxr-xr-x. 2 root root 6 Jan 21 15:39 dir2 drwxr-xr-x. 2 root root 6 Jan 21 15:39 dir3 -rw-r--r--. 1 root root 0 Jan 21 15:38 file1.txt -rw-r--r--. 1 root root 0 Jan 21 15:38 file2.txt -rw-r--r--. 1 root root 0 Jan 21 15:38 file3.txt #文件类型 权限 引用计数 所有者 所属组 大小 文件修改时间 文件名1.2.3.4.5.6.7.8.9.10.

我们已经知道-l选项用于显示文件的详细信息,那么-l选项显示的这 7 列分别是什么含义?

第一列: 文件类型和权限;第二列: 引用计数;文件的引用计数代表该文件的硬链接个数,而目录的引用计数代表该目录有多少个一级子目录;第三列: 所有者,也就是这个文件属于哪个用户;默认所有者是文件的建立用户;第四列: 所属组;默认所属组是文件建立用户的有效组,一般情况下就是建立用户的所在组;第五列: 大小;默认单位是字节。第六列: 文件修改时间;这里的时间是文件最后被更新(包括文件创建、内容更新、文件名更新等)的时间,可用如下命令查看文件的修改、访问及变化的时间;ls -l、ls -l --time=atime、 ls -l --time=ctime,注意: 这里只是显示不同的文件属性时间,并不是按照属性时间排序;第七列: 文件名;

可能有人已经注意到了,创建或修改时间的格式没有年份的信息,那么如何显示时间的全部信息呢?请看范例4。

(4) 可能有人已经注意到了,创建或修改时间的格式没有年份的信息,那么如何显示时间的全部信息呢?

复制
[root@localhost test]# ls -l --time-style=long-iso total 0 drwxr-xr-x. 2 root root 6 2022-01-21 15:39 dir1 drwxr-xr-x. 2 root root 6 2022-01-21 15:39 dir2 drwxr-xr-x. 2 root root 6 2022-01-21 15:39 dir3 -rw-r--r--. 1 root root 0 2022-01-21 15:38 file1.txt -rw-r--r--. 1 root root 0 2022-01-21 15:38 file2.txt -rw-r--r--. 1 root root 0 2022-01-21 15:38 file3.txt1.2.3.4.5.6.7.8.

对于上面的命令,说明如下:

--time-style可选的参数值有如下几个,如full-iso、long-iso、iso、locale,默认值是locale。在生产场景中经常会遇到同一目录下的文件及目录时间的显示不一致的问题,所以需要用ls -l --time-style=long-iso来调整。值得一提的是,执行ls -l等命令时,默认显示的是文件最后一次的修改时间(如果是新文件那么就是创建时间了)。ls --full-time用于显示完整的时间,等同于ls -l --time-style=full-iso。对应ls命令,查看时间戳的选项如下:mtime:最后修改时间(ls -lt): 修改文件内容,文件的修改时间(modify time)会改变。ctime:状态改变时间(ls -lc): 修改文件内容、移动文件或改变文件属性 等,文件的change时间会改变。atime:最后访问时间(ls -lu): 查看文件内容时,文件的访问时间(access time)会改变。

既然ls -l输出结果的时间属性列为修改时间,那么能否改成其他的时间呢?例如:显示最后一次文件访问时间。这当然也是可以的。

(5) 执行ls命令,带显示内容的访问时间属性的参数;

复制
[root@localhost test]# ls -l --time=atime # 输出结果的时间属性列将显示文件最后一次访问时间1.2.

与之相关命令还有ls -l --time-style=long-iso --time=ctime,用于显示文件改变的时间。

(6) 执行ls命令,带-F参数(这一点与tree命令的-F很类似)。

复制
[root@localhost test]# ls -F dir1/ dir2/ dir3/ file1.txt file2.txt file3.txt #加了-F,可以清晰的看到所有目录的结尾都被加上了斜线。当我们要过滤出所有的目录时,那么只需要把带斜线的过滤出来就OK[root@localhost test]# ls -F | grep / dir1/ dir2/ dir3/ [root@localhost test]# ls -F | grep -v / #过滤非目录文件 file1.txt file2.txt file3.txt1.2.3.4.5.6.7.8.9.10.11.12.13.14.

ls -F命令表示在每个文件名后附上一个字符以说明文件的类型:

*表示可执行的普通文件;/表示目录;=表示套接字(sockets);|表示FIFOs;@表示符号链接;

(7) 使用-d参数只显示目录本身的信息。

复制
[root@localhost test]# ls -l dir1/ total 0 #这样根本无法查看dir1目录本身的信息,除非到上级目录下查看1.2.3.

如果只是想显示目录本身的信息,那么这个时候-d就派上用场了。

复制
[root@localhost test]# ls -ld dir1/ drwxr-xr-x. 2 root root 6 Jan 21 15:39 dir1/1.2.

(8) 使用-R参数递归查看目录。

复制
[root@localhost test]# mkdir -p dir1/sub1/test #递归创建目录的命令 [root@localhost test]# ls -R dir1 #类似但是没有tree好用的方法 dir1: sub1 dir1/sub1: test dir1/sub1/test:1.2.3.4.5.6.7.8.9.
技巧性范例

(1) 查找最近更新过的文件。

在工作中,我们经常需要查看一个有很多文件的目录,找出最近更新过但不知道具体文件名的文件,这时就可以用ls -lrt或ls -rt这个组合命令。

复制
[root@localhost test]# touch /etc/test.txt #创建一个新文件,假设不知道名字,你如何快速找到它? [root@localhost test]# ls -lrt /etc #-t是按时间排序,-r是倒叙,即按时间倒叙排序 .... -rw-r--r--. 1 root root 0 Jan 21 16:07 test.txt #最后一屏的最后一行就是我们需要查找的文件 [root@localhost test]# ls -lrt /etc | tail -1 #如果需要直接定位文件还可以使用此命令 -rw-r--r--. 1 root root 0 Jan 21 16:07 test.txt1.2.3.4.5.6.7.8.9.10.

(2) 生产场景数据库备份,获取数据库名列表。

复制
[root@mysql ~]# ls -F /var/lib/mysql/ | egrep "/" | awk -F "/" {print $1} #innodb_temp jumpserver mysql performance_schema sys1.2.3.4.5.6.

(3) 使用-F选项查看文件的类型

复制
[root@localhost ~]# ll -Fd test drwxr-xr-x. 2 root root 4096 Jul 14 23:40 test/1.2.

其实还有个类似的选项-p,它的功能比较简单,只是在目录后面加上/。

THE END