要想知道系统中有哪些文件,可以使用列表命令(ls)。本节将描述ls命令和可用来格式化其输出信息的选项。
ls命令最基本的形式会显示当前目录下的文件和目录:
命令/参数 | 备注 |
---|---|
ls | 按列排序显示当前目录下的文件和目录 |
-F | 区分文件和目录。在目录名后加了正斜线(/),在可执行文件(比如上面的my_script文件)的后面加个星号 |
-a | 把隐藏文件(以点号开始的文件)和普通文件及目录一起显示出来 |
-R | 递归选项,列出了当前目录下包含的子目录中的文件 |
-l | 产生长列表格式的输出,包含了目录中每个文件的更多相关信息 |
-l --time=atime | 显示出已经更改过的文件访问时间 |
文件匹配规则 | 备注 |
---|---|
? | 问号可用于过滤器字符串中替代任意位置的单个字符 |
* | 星号可匹配零个或多个字符 |
[ ] | 中括号表示一个字符位置并给出多个可能的选择 |
[ai] | 匹配该位置为a或i的文件名 |
[a – i] | 指定字符范围,例如字母范围[a – i] ,即该位置从a到i的字母都会匹配 |
[!a] | 排除该位置为a的文件名 |
ls命令最基本的形式会显示当前目录下的文件和目录:
$ ls
Desktop Downloads Music Pictures Templates Videos
Documents examples.desktop my_script Public test_file
注意,ls命令输出的列表是按字母排序
的(按列排序
而不是按行排序)。如果用户用的是支持彩色的终端仿真器,ls命令还可以用不同的颜色来区分不同类型的文件。LS_COLORS环境变量控制着这个功能。(第6章中会讲到环境变量。)不同的Linux发行版根据各自终端仿真器的能力设置这个环境变量。
如果没安装彩色终端仿真器,可用带-F参数的ls命令轻松区分文件和目录。使用-F参数可以得到如下输出:
$ ls -F
Desktop/ Downloads/ Music/ Pictures/ Templates/ Videos/
Documents/ examples.desktop my_script* Public/ test_file
-F参数在目录名后加了正斜线(/),以方便用户在输出中分辨它们。类似地,它会在可执行文件(比如上面的my_script文件)的后面加个星号
,以便用户找出可在系统上运行的文件。
基本的ls命令在某种意义上有点容易让人误解。它显示了当前目录下的文件和目录,但并没有将全部都显示出来。Linux经常采用隐藏文件来保存配置信息
。在Linux上,隐藏文件通常是文件名以点号开始的文件
。这些文件并没有在默认的ls命令输出中显示出来,因此我们称其为隐藏文件。
要把隐藏文件和普通文件及目录一起显示出来,就得用到-a参数。下面是一个带有-a参数的ls命令的例子:
所有以点号开头的隐藏文件现在都显示出来了。注意,有三个以.bash开始的文件。它们是bash shell环境所使用的隐藏文件,在第6章会对其进行详细的讲解。
-R参数是ls命令可用的另一个参数,叫作递归选项。它列出了当前目录下包含的子目录中的文件。如果目录很多,这个输出就会很长。以下是-R参数输出的简单例子:
$ ls -F -R
.:
Desktop/ Downloads/ Music/ Pictures/ Templates/ Videos/
Documents/ examples.desktop my_script* Public/ test_file
./Desktop:
./Documents:
./Downloads:
./Music:
ILoveLinux.mp3*
./Pictures:
./Public:
./Templates:
./Videos:
注意,首先-R参数显示了当前目录下的内容,也就是之前例子中用户home目录下的那些文件。另外,它还显示出了用户home目录下所有子目录及其内容。只有Music子目录中包含了一个可执行文件ILoveLinux.mp3。
选项并一定要像例子中那样分开输入:ls –F –R。它们可以进行如下合并:ls –FR。
在上一个例子中,子目录中没再包含子目录。如果有更多的子目录,-R参数会继续进行遍历。正如你所看到的,如果目录结构很庞大,输出内容会变得很长。
在基本的输出列表中,ls命令并未输出太多每个文件的相关信息。要显示附加信息,另一个常用的参数是-l。-l参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息。
ls -l
total 48
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Desktop
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Documents
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Downloads
-rw-r--r-- 1 christine christine 8980 Apr 22 13:36 examples.desktop
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fall
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fell
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fill
-rw-rw-r-- 1 christine christine 0 May 21 13:44 full
drwxr-xr-x 2 christine christine 4096 May 21 11:39 Music
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_file
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
-rw-rw-r-- 1 christine christine 0 May 21 13:42 new_file
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Pictures
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Public
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Templates
-rw-rw-r-- 1 christine christine 0 May 21 11:28 test_file
drwxr-xr-x 2 christine christine 4096 Apr 22 20:37 Videos
$
这种长列表格式的输出在每一行中列出了单个文件或目录。除了文件名,输出中还有其他有用信息。输出的第一行显示了在目录中包含的总块数。在此之后,每一行都包含了关于文件(或目录)的下述信息:
下面以Music文件为例进行介绍:
drwxr-xr-x 2 christine christine 4096 May 21 11:39 Music
列属性序号 | 列属性名 | 示例 | 注释 |
---|---|---|---|
1 | 文件类型 | d | 目录(d)、文件(-)、字符型文件(c)或块设备(b) |
2 | 文件的权限 | rwxr-xr-x | (参见第6章) |
3 | 文件的硬链接总数 | 2 | |
4 | 文件属主的用户名 | christine | |
5 | 文件属组的组名 | christine | |
6 | 文件的大小 | 4096 | (以字节为单位) |
7 | 文件的上次修改时间 | May 21 11:39 | 月 日 时间 |
8 | 文件名或目录名 | Music |
-l参数是一个强大的工具。有了它,你几乎可以看到系统上任何文件或目录的大部分信息。
在进行文件管理时,ls命令的很多参数都能派上用场。如果在shell提示符中输入man ls,就能看到可用来修改ls命令输出的参数有好几页。
别忘了可以将多个参数结合起来使用。你不时地会发现一些参数组合不仅能够显示出所需的内容,而且还容易记忆,例如ls –alF。
前面的例子可知,默认情况下,ls命令会输出目录下的所有非隐藏文件。有时这个输出会显得过多,当你只需要查看单个少数文件信息时更是如此。
幸而ls命令还支持在命令行中定义过滤器。它会用过滤器来决定应该在输出中显示哪些文件或目录。
这个过滤器就是一个进行简单文本匹配的字符串。可以在要用的命令行参数之后添加这个过滤器:
$ ls -l my_script
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
当用户指定特定文件的名称作为过滤器时,ls命令只会显示该文件的信息。有时你可能不知道要找的那个文件的确切名称。ls命令能够识别标准通配符,并在过滤器中用它们进行模式匹配:
问号(?)代表一个字符;
星号(*)代表零个或多个字符。
问号可用于过滤器字符串中替代任意位置的单个字符。例如:
$ ls -l my_scr?pt
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
其中,过滤器my_scr?pt与目录中的两个文件匹配。类似地,星号可匹配零个或多个字符。
$ ls -l my*
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_file
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
使用星号找到了三个名字以my开头的文件。和问号一样,你可以把星号放在过滤器中的任意位置。
$ ls -l my_s*t
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
在过滤器中使用星号和问号被称为文件扩展匹配(file globbing),指的是使用通配符进行模式匹配的过程。通配符正式的名称叫作元字符通配符(metacharacter wildcards)。除了星号和问号之外,还有更多的元字符通配符可用于文件扩展匹配。可以使用中括号。
$ ls -l my_scr[ai]pt
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
$
在这个例子中,我们使用了中括号以及在特定位置上可能出现的两种字符:a或i。中括号表示一个字符位置并给出多个可能的选择。可以像上面的例子那样将待选的字符列出来,也可以指定字符范围,例如字母范围[a – i]。即该位置从a到i的字母都会匹配。
$ ls -l f[a-i]ll
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fall
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fell
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fill
$
另外,可以使用感叹号(!)将不需要的内容排除在外。
$ ls -l f[!a]ll
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fell
-rw-rw-r-- 1 christine christine 0 May 21 13:44 fill
-rw-rw-r-- 1 christine christine 0 May 21 13:44 full
$
在进行文件搜索时,文件扩展匹配是一个功能强大的特性。它也可以用于ls以外的其他shell命令。本章随后的部分会有到更多相关的例子。