列出目录内容
命令语法格式
ls [OPTION]… [FILE]…
命令描述
命令ls列出有关文件(任何类型的文件,包括目录)的信息。像往常一样,选项和文件参数可以任意混合。
对于非选项的命令行参数,如果是目录,缺省情况下,ls会列出目录的内容(不是递归列出),并省略文件名以“.”开头的文件;对于其他非选项参数,默认情况下,ls只列出文件名。如果没有指定非选项参数,那么ls在当前目录下运行,就好像使用参数’.’进行调用。
默认情况下,根据有效的语言环境设置,输出的文件及目录名按字母顺序排序。如果标准输出为终端,则按列进行输出(垂直排序),控制字符作为问号输出; 否则,输出每行输出一列,控制字符按原样输出。
因为ls是一个非常基本的程序,多年来积累了很多选项。在下面的部分中会介绍它们;在每个部分中,选项按字母顺序列出(忽略大小写)。将选项分为小节并不是一个十分准确的做法,因为一些选项会影响ls操作的多个方面。
下面会按不同的部分进行介绍这些选项。
命令行选项
列出哪些文件
下面的这些选项决定ls会为哪些文件列出信息。默认情况下,ls列出文件和命令行参数中任何目录里的内容,但是会忽略目录中文件名以’.’开头的文件。
-a, –all
列出所有的文件和目录,包括那些文件名以‘.’开始、默认会被忽略的文件。
-A, –almost-all
列出所有的文件和目录,包括那些文件名以“.”开始、默认会被忽略的文件。但是,会忽略“.”和“..”。选项–all (-a)会覆盖该选项。
-B, –ignore-backups
忽略目录中以“~”结尾的文件。该选项等价于–ignore=’*~’ –ignore=’.*~’组合。
-d, –directory
与其他类型的文件一样,列出目录名,而不是列出其内容。除非指定了–dereference-command-line(-H),–deference(-L)或–dereference-command-line-symlink-to-dir选项,否则不会解析命令行中列出的符号链接。
-H, –dereference-command-line
如果命令行参数指定了符号链接,则显示链接引用的目标的信息,而不是链接本身的信息。
–dereference-command-line-symlink-to-dir
不要解析符号链接,显示符号链接的信息。但是:如果命令行参数是一个指向目录的符号链接,则显示该目录的信息,而不是符号链接本身。当没有指定其他与解析符号链接相关的选项时,这是默认行为。(–classify (-F), –directory (-d), (-l), –dereference (-L), –dereference-command-line (-H)).
–group-directories-first
将文件之前的所有目录分组,然后使用指定的的排序方式(请参阅–sort选项)分别对目录和文件进行排序。也就是说,此选项指定主要排序键,而–sort选项指定辅助键。但是,使用–sort=none(-U)会完全禁用此选项。
–hide=PATTERN
在目录中,除非给出–all(-a)或–almost-all(-A),否则忽略文件名与PATTERN匹配的文件。该选项的作用类似于–ignore=PATTERN,不同的地方是如果还给出了–all(-a)或–almost-all(-A)选项,则该选项无效。
该选项在SHELL别名中很有用。例如,如果lx是ls –hide=’*~’的别名,并且ly是ls –ignore=’*~’的别名,则命令lx -A列出文件README~,而’ly -A’不会。
-I pattern, –ignore=pattern
在目录中,忽略文件名与pattern(非正则表达式)匹配的文件。与在SHELL中一样,文件名中的起始’.’在模式开始处与通配符不匹配。有时候多次给这个选项是有用的。例如,
第一个选项忽略文件名以’.’开头且长度至少为3的文件,第二个选项忽略文件名以’.’开头且为两个字符的文件,但是’..’外,第三个选项忽略以’#’开头的名称。
-L, –dereference
显示符号链接的所指向的文件的信息时,而不是链接本身的信息。但是,即使使用此选项,ls仍会打印链接本身的名称,而不是链接指向的文件的名称。
-R, –recursive
递归显示所有目录中的内容。
显示哪些信息
这些选项会控制了显示的信息。默认情况下,只显示文件名。
–author
在生成长格式的目录列表时,列出每个文件的作者。在GNU/Hurd中,文件作者可能与其所有者不同,但在其他操作系统中,两者是相同的。
-D, –dired
在使用长列表格式(-l)时,在主输出之后打印另一行:
其中,begn和endn是无符号整数,用于记录输出中每个文件名的开头和结尾的字节位置。这使得Emacs很容易找到这些名称,即使它们包含不寻常的字符,如空格或换行符,也没有奇怪的搜索。
如果以递归方式(-R)列出目录,则为每个子目录名称输出一个类似偏移量的行:
最后输出一行:
后面的–quoting-style=word是引用样式。
下面是一个实际的例子:
# touch a/f1 a/f2
# touch a/sub/deeper/file
# ls -gloRF –dired a
a:
total 8
-rw-r--r-- 1 0 Jun 10 12:27 f1
-rw-r--r-- 1 0 Jun 10 12:27 f2
drwxr-xr-x 3 4096 Jun 10 12:27 sub/
drwxr-xr-x 2 4096 Jun 10 12:27 sub2/
a/sub: total 4 drwxr-xr-x 2 4096 Jun 10 12:27 deeper/ a/sub/deeper: total 0 -rw-r--r-- 1 0 Jun 10 12:27 file a/sub2: total 0 //DIRED// 48 50 84 86 120 123 158 162 217 223 282 286 //SUBDIRED// 2 3 167 172 228 240 290 296 //DIRED-OPTIONS// --quoting-style=literal
请注意,上面在//DIRED//行上的偏移量分别对应了:f1,f2,sub,sub2,deeper, file。在//SUBDIRED//行的偏移量分别对一个了:a, a/sub, a/sub/deeper, a/sub2。
以下是如何提取第五个条目名称(’deeper’)的例子,对应的偏移量是222和228:
# dd bs=1 skip=217 count=6 < out 2>/dev/null; echo
deeper
请注意,虽然上面输出列表中的“deeper”条目的尾部包含了一个斜线,但dd的count值为6,没有选择尾部的斜线。但是,如果在ls中使用了–dired和–escape(-b)选项,并在文件名中包含特殊字符的文件上运行,在使用dd时,count值中注意要把反斜杠结算在内:
# ls -blog –dired ‘a b’
-rw-r–r– 1 0 Jun 10 12:28 a\ b
DIRED 30 34
DIRED-OPTIONS –quoting-style=escape
如果使用添加引号的引用样式(例如–quoting-style=c),则偏移量会包含引号。因此,请注意,用户可以通过环境变量QUOTING_STYLE选择引用样式。因此,使用–dired的应用程序应该在命令行中指定明确的–quoting-style=literal选项(又名-N或–literal),否则就需要解析带有转义字符的文件名。
–full-time
输出的长格式的目录列表,同时列出完整的时间。相当于使用–format=long和–time-style=full-iso
-g
显示长格式的目录列表,但不要显示所有者信息。
-G, –no-group
在长格式目录列表中禁止显示组信息。(这是一些非GNU版本中的ls中的默认设置,因此GNU版本的ls提供此选项以实现兼容性。)
-h, –human-readable
为每个文件或目录的大小添加一个大小字母,例如mebibytes的’M’。使用1024的倍数,而不是1000;’M’代表1,048,576字节。相当于–block-size=human-readable。如果你喜欢1000的倍数,可以使用–si选项。
-i, –inode
将每个文件的inode编号(也称为文件序列号和索引编号)打印在文件名的左侧。(该数字唯一标识特定文件系统中的每个文件。)
-l, –format=long, –format=verbose
除了每个文件的名称之外,还可以打印文件类型、文件权限位、硬链接数、所有者名称、组名、大小、时间戳,通常为修改时间戳。对于无法确定的信息,则会打印问号。
通常情况下,文件大小的格式为没有标点符号的字节数,但可以修改显示格式(参见「块大小」)。例如,使用选项-h打印一个简短的可读计数;指定–block-size=’1’选项,则用当前语言环境中的千位分隔符打印一个字节计数。
对于输出中列出的每个目录,以“total blocks”行作为开始,其中blocks是该目录中所有文件的总磁盘分配。当前默认的blocks的大小为1024字节,但可以进行修改(参见「块大小」)。计算出的blocks大小中可能包含了重复的硬连接,这可以说是一个缺陷。
对于文件类型,可以是以下字符之一:
‘b’,块特殊文件
‘c’,字符特殊文件
‘C’,高性能(“连续数据”)文件
‘d’,目录
‘D’,存在于Solaris 2.5及以上的DOOR文件。用于客户端和服务器的应用进程之间通信的文件。
‘l’,符号链接
‘M’,脱机(“迁移”)文件(Cray DMF)
‘n’,网络特殊文件(HP-UX)
‘p’,FIFO (命名管道)
‘P’,存在于Solaris 10及以上的端口文件
‘s’,套解字文件
‘?’,其他未知的文件类型
对于权限标志,输出中列出的文件权限位与符号模式规范类似(请参阅符号模式)。但是,ls将多个位组合成每组权限的第三个字符,含义如下所示:
‘S’,如果setuid或setgid位设置了,但是可执行位没有设置。
‘t’,如果限制删除标志(或沾滞位),以及其他可执行位都设置。注意,限制删除标志是粘性位的另一个名称。参见文件权限位。
‘T’,如果限制删除标志(或沾滞位)设置了,但是其他可执行位没有设置。
‘x’,只设置了可执行为,但是上面提到的没有被设置。
‘-’,其他情况(什么都没有设置)。
文件模式位之后是一个单个字符,用于指定是否将“访问控制列表(ACL)”等替代访问方法应用于该文件。对于:
- 当文件权限位之后的字符是空格时,表示不存在备用访问方法。
- 当它是一个可打印字符时,则表示有这样一种方法。
在GNU ls中,使用“.”字符来指示具有安全上下文的文件,但没有其他替代访问方法。具有其他任何访问方法组合的文件都标有一个加号(“+”)字符。
-n, –numeric-uid-gid
生成的长格式目录列表,但是显示数字类型的用户ID和组ID,而不是所有者名和组名。
-o
产生长格式的目录列表,但不显示组信息。它相当于使用–format=long –no-group组合。
-s, –size
将每个文件的磁盘分配打印到文件名的左侧。这是文件使用的磁盘空间量,通常比文件大小多一点,但如果文件有空洞,则可能会少一些。
通常情况下,磁盘分配以1024字节为单位打印,但可以修改(参见块大小)。
对于从HP-UX系统通过NFS挂载到BSD系统的文件,此选项报告的大小是正确值的一半。在HP-UX系统上,它报告的大小是从BSD系统安装NFS的文件的正确值的两倍。这是由于HP-UX中的一个缺陷;它也会影响HP-UX中的ls程序。
–si
为每个大小附加一个SI样式的缩写,例如兆字节为’M’。使用1000的倍数,而不是1024;’M’代表1,000,000字节。该选项等同于–block-size=si。如果你喜欢1024的倍数,使用-h或–human-readable选项。
-Z, –context
如果没有找到,则显示SELinux安全上下文或’?’。当与-l选项一起使用时,将安全上下文打印到文件大小列的左侧。
输出排序
这些选项用于控制输出信息的排序。默认情况下是按照字符的ASCII码进行排序的。
-t, –sort=time
根据修改时间排序(mtime),最新的在第一个。参见文件时间戳。
-c, –time=ctime, –time=status
如果正在使用长列表格式(例如-l,-o)输出,则打印状态更改时间(ctime)而不是mtime。当按时间显式排序(–sort=time或-t)或不使用长列表格式时,请根据ctime进行排序。请参阅文件时间戳。
-u, –time=atime, –time=access, –time=use
如果正在使用长列表格式(例如–format=long),则打印上次访问的时间戳(atime)。当按时间显式排序(–sort = time或-t)或不使用长列表格式时,根据atime进行排序。请参阅文件时间戳。
-r, –reverse
反转排序方法的任何内容。例如,按照反向字母顺序列出文件,最新的第一个,最小的第一个,其他的。
-S, –sort=size
根据文件大小排序,最大的显示在第一个。
-U, –sort=none
不要排序;按照它们存储在目录中的顺序列出文件。(不做任何其他无关的事情,对比-f选项。)这在列出内容非常多的目录时特别有用,因为不进行任何排序可以明显更快。
-f
类似于-U选项,不要排序;按照它们存储在目录中的顺序列出文件。但是也启用-a(列出所有文件)并禁用-l、–color、-s(如果它们是在-f之前指定的)。
-v, –sort=version
按版本名称和编号排序,小的优先。它的行为类似于默认排序,除了每个十进制数字序列在数字上被视为索引/版本号。查看「关于版本排序的详细信息」
-X, –sort=extension
以文件扩展名(’.’后的字符)按字母顺序对目录中的内容进行排序; 没有扩展名的文件被排在第一位。
输出格式
下面的选项控制了输出的格式
-1, –format=single-column
每行列出一个文件。当标准输出不是终端时,这是ls的默认值。另请参阅-b和-q选项以禁止在文件名中直接输出换行符。
-C, –format=vertical
在列中列出文件,垂直排序。如果标准输出是终端,这是ls的默认值。它始终是dir(1)程序的默认设置。GNU实现的ls使用可变宽度的列来尽可能多的显示文件,以最少的行。
-x, –format=across, –format=horizontal
水平列出文件,但是垂直方向上是对齐显示的。对比-m选项。
-m, –format=commas
水平列出文件,每行用逗号和空格(‘, ’)进行分隔。
–color [=when]
指定是否使用颜色区分文件类型。参数when可以被省略,或者以下之一:
auto,只有标准输出是终端时才显示颜色。
always,总是使用颜色。
指定–color等价于–color=always。如果通过管道将带有颜色的输出列表传递给分页程序(比如less),请使用-R选项将颜色代码传递给终端。
请注意,使用–color选项时,如果目录中的内容很多,可能会导致显著的性能损失,因为在默认设置中要求ls统计它列出的每个单个文件。但是,如果希望大部分文件类型着色,但可以没有其他着色选项(例如,可执行文件、孤立文件、粘性文件、其他可写入文件、功能)的情况下运行,请使用dircolors(1)像这样设置LS_COLORS环境变量,
并且在具有dirent.d_type功能的文件系统上,每个命令行参数只能执行一次stat调用。
-F, –classify, –indicator-style=classify
为每个文件名添加一个字符,指出文件类型。如果是目录,则追加一个斜线’/’;符号链接追加一个’@’;FIFO则追加’|’;套接字追加’=’;DOOR文件则为’>’;常规文件则只显示文件名。另外,对于可执行的常规文件,附加“*”。除非指定了–dereference-command-line(-H),–deference(-L),–dereference-command-line-symlink-to-dir选项,否则不要解析命令行中列出的符号链接。
–file-type, –indicator-style=file-type
为每个文件名添加一个字符,指出文件类型。这与-F相似,但可执行文件不会进行标记。
–hyperlink [=when]
输出可以被某些终端识别的用于链接到文件的代码,使用’file://’URI格式。when可以省略,或者是以下之一:
指定–hyperlink和no时相当于–hyperlink=always。
–indicator-style=word
将字符指示符与样式word追加到条目名称中,如下所示:
‘slash’,将斜线(/)追加到目录的后面。等价于-p。
‘file-type’,将斜线(/)追加到目录的后面;符号链接追加一个’@’;FIFO则追加’|’;套接字追加’=’;常规文件则只显示文件名。等价于–file-type
‘classify’,将星号(*)追加到常规可执行文件后面,另一方面就和‘file-type’一样了。等同于-F(–classify)选项。
-k, –kibibytes
将默认块大小设置为其1024字节的正常值,覆盖环境变量中的任何相反规格(请参阅块大小)。该选项又被–block-size,-h,–human-readable,–si选项覆盖。
-k或–kibibytes选项会影响由-l和类似选项写入的每个目录块计数,以及由-s或–size选项写入的大小。它不会影响由-l写入的文件大小。
-p, –indicator-style=slash
将斜线(‘/’)追加到文件名后面。
-T cols, –tabsize=cols
假设每个制表符都是cols宽。缺省值为8。ls在输出中尽可能使用制表符,以提高效率。如果cols为零,则表示不要使用制表符。
某些终端仿真程序可能无法正确地将列对齐非ASCII字节后面的TAB右侧。可以通过使用-T0选项或在的环境中设置TABSIZE=0来避免此问题,以告诉ls使用空格对齐,而不是制表符。
-w cols, –width=cols
假设屏幕是列宽为cols。如果可能的话,默认取自终端设置; 否则使用环境变量COLUMNS(如果已设置); 否则默认值为80。对于cols值’0’,输出行的长度没有限制,并且单个输出行将用空格而不是制表符分隔。
格式化文件时间戳
默认情况下,文件时间戳以缩略形式列出。使用诸如“Mar 30 2002”之类的日期来表示非最近的时间戳;对于最近的时间戳,使用诸如“Mar 30 23:45”之类的没有年份的日期和时间的格式来表示。这种格式可以根据当前语言环境进行更改,如下所述。
如果时间戳在半年以内,则认为它是近期的,并且未来不会过期。如果今天的时间戳没有以最近的形式列出,而时间戳是将来的时间,这你的系统中可能有出现了时钟偏移问题,这可能会破坏依赖文件时间戳的程序,如make。请参阅「文件时间戳」。
根据由TZ环境变量指定的时区规则来列出时间戳,或者如果未设置TZ,则按照系统默认规则列出时间戳。请参阅GNU C库参考手册中的使用TZ指定时区。
以下选项更改打印文件时间戳的方式:
–time-style=style
按风格style列出时间戳。style应该是以下之一:
如果格式format包含由换行符分隔的两个字符串,则前者用于非最近的文件,后者用于最近的文件;如果希望输出列排成一列,则可能需要以两种格式之一插入空格。
这很有用,因为时间输出中包含了操作系统中能提供的所有信息。例如,这可以帮助解释make的行为,因为GNU make使用完整的时间戳来确定文件是否过期。
‘
# ls -l –time-style=”+%Y-%m-%d $newline%m-%d %H:%M”
# ls -l –time-style=”iso”
语言环境类别LC_TIME指定了时间戳的格式。默认的POSIX语言环境使用’Mar 30 2002’和’Mar 30 23:45’等时间戳;在这个语言环境中,以下两个ls调用是等价的:
‘
# ls -l –time-style=”+%b %e %Y$newline%b %e %H:%M”
# ls -l –time-style=”locale”
可以使用环境变量TIME_STYLE来指定–time-style选项的默认值;如果未设置TIME_STYLE,则默认样式为“locale”。GNU Emacs 21.3和更高版本使用–dired选项,因此可以解析任何日期格式,但是如果使用Emacs 21.1或21.2并指定非POSIX语言环境,则可能需要设置’TIME_STYLE=”posix-long-iso”。
为了避免某些拒绝服务攻击,可能会将超过1000字节的时间戳视为错误。
格式化文件名
这些选项更改文件名称本身的打印方式。
-b, –escape, –quoting-style=escape
使用字母和八进制反斜杠序列在文件名称中引用不可打印的字符,正如C中使用的那些字符。
-N, –literal, –quoting-style=literal
不要引用文件名称。但是,如果输出是终端,并且未指定–show-control-chars选项,则使用问号代表非打印字符。
-q, –hide-control-chars
在文件名中打印问号,而不是非图形字符。如果输出是终端,并且程序是ls,则这是默认值。
-Q, –quote-name, –quoting-style=c
将文件名用双引号括起来,并引用打印字符,正如C中所示。
–quoting-style=word
使用样式word来引用文件名和其他可能包含任意字符的字符串。word应该是以下之一:
可以使用环境变量QUOTING_STYLE指定–quoting-style选项的默认值。如果未设置该环境变量,则当输出为终端时,默认值为’shell-escape’,否则为’literal’。
–show-control-chars
在文件名中按原样打印非图形字符。除非输出是终端,并且程序是ls,否则这是默认值。
其他选项
和大多数命令一样,ls也支持如下的基本选项:
–help
显示帮助信息并退出。
–version
显示版本信息并退出。
注意事项
关于“版本排序”的详细信息
版本排序处理的文件名通常包含索引或版本号信息。标准的排序通常不会产生预期的效果,因为它是按照逐个字符进行比较排序的。如果浏览的目录中包含许多带有索引/版本号的文件,版本排序特别有用:
abc.zml-1.gz abc.zml-1.gz
abc.zml-12.gz abc.zml-2.gz
abc.zml-2.gz abc.zml-12.gz
版本排序字符串进行比较,如果ver1和ver2是版本号,前缀(prefix)和后缀(suffix)匹配正则表达式(\.[A-Za-z~][A-Za-z0-9~]*)*,那么ver1 < ver2意味着由“prefix ver1 suffix”组成的文件名会排在“prefix ver2 suffix”前面。
还要注意,数字部分的前导零被忽略:
abc-1.007.tgz abc-1.01a.tgz
abc-1.012b.tgz abc-1.007.tgz
abc-1.01a.tgz abc-1.012b.tgz
版本排序功能是使用gnulib的filevercmp函数实现的,它有一些值得注意的地方:
- LC_COLLATE被忽略,这意味着ls -v和sort -V在排序非数字前缀时,与把LC_COLLATE语言环境类别被设置为’C’是相同的。
- 一些后缀与上面提到的正则表达式不匹配。因此,这些示例可能无法按的预期排序。比如:
abc-1.2.3.7z
abc-1.2.3.x86_64.rpm
如上所述。
退出状态
0 成功。
1 次要问题。例如,访问未指定为命令行参数的文件或目录发生失败时。在列出主动删除或重命名条目的目录时会发生这种情况。
2 严重的问题。例如,内存耗尽,选项无效,无法访问指定为命令行参数的文件或者目录,或无法目录循环。
相关手册
dir(1), vdir(1)
查看在线手册:http://www.gnu.org/software/coreutils/ls
查看info手册:info ‘(coreutils) ls invocation’
参考文献
- man 1 ls, version GNU coreutils 8.26
更新日志
- 06/16/2018 创建文章