2.2《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——列表
也许最常用的Unix命令是ls
了,它是‘list’的简写(Listing 8)
Listing 8 用
ls
以列表的形式显示文件和目录(内容输出跟各自电脑有关)$ ls
Desktop
Downloads
sonnet_1.txt
sonnet_1_reversed.txt
ls
命令简单地列出了当前路径下的所有文件和目录(但不包括被隐藏的文件,我们过一会儿就会提到它)。从另一个意义上讲,它实际上是图形浏览器的命令行版本,用于显示文件和目录,如插图15。(我们将在第四章中加深对目录和文件的理解)正如一个图形文件浏览器样,在Listing 8中的输出内容只是个示例,具体结果会根据你用的系统有小的差异。(这对所有的例子都是一样,所以不用纠结于输出上的微小差别。)
ls
命令还可以用来检查一个文件(或目录)是否存在,因为如果ls
命令后接一个不存在的文件会报错,如Listing 9 所示:
Listing 9: 对一个不存在的文件使用
ls
命令
$ ls foo
ls: foo: No such file or directory
$ touch foo
$ ls foo
foo
上面Listing 9中使用touch
命令创建一个名为foo
的空文件(如Box7), 所以第二次我们再使用ls
时错误消失了。(touch
原本的用途是改变文件或目录的修改时间,但像Listing 9 中那样用touch
创建空文件是个常见的Unix用法。)
Box 7. Foo,bar, baz等.
当阅读计算机时,会遇到相当奇怪的词——像foo,bar, baz,而且它还经常被用到。确实,除了用
ls foo
和touch foo
外,在本教程中已经出现了四次这样的指示词: 一次在典型命令行(图2中)第一章节,一次是虚拟机器码(foobar!
,Box2),再有一次是逃离窘境(grep foobar
, Box4), 还有一次是在手册页中(Listing3),前三个是我自己用的,但是最后一个我什么也没做哦:
...if name contains a slash (/) then man interprets it as a file specification, so that you can do man ./foo.5 or even man /cd/foo/bar.1.gz.
这里我们看到了man
本身也在手册页中使用了foo和bar——这毫不含糊地证明了它在计算机中的地位。
那这些古老术语源自哪里?老办法, 查Jargon File(在上面输入foo
),上面说:
foo: /foo/
- 感叹词. 表达厌恶、恶心。
- [非常常见] 常用做任何事物的示例名字,尤其是程序或文件(特别是临时文件)。
- 最开始在语法示例使用metasyntactic变量的标准列表中使用,另外也有bar、baz,qux,quux等。
当我们结合使用'foo'和'bar'时,通常要追溯到二战时期说的喱语FUBAR(戳原意), 后来被改为foobar。早期版本的Jargon File将这一变化解释为战后的归化,但现在看起来FUBAR更可能是'foo'的衍生物,可能是受德国furchtbar(太糟了)的影响——'foobar'实际上可能是原来的形式。
在metasyntactic变量中,我们接着可以发现如下的内容:metasyntactic变量: n.
在例子中使用的名字,被理解为代表正在讨论的任何事物,或任何讨论中的任何类别的随机成员。foo就是个典型的例子。为避免疑惑,hackers从不(好吧,几乎不)使用'foo'或者其他能代表任何事物的名字。在文件命名上,一个公共惯例是以metasyntactic变量名开始的文件名是个随时可能被删除的临时文件。
Metasyntactic变量这么叫的原因有以下几点:
(1) 它们是用于讨论程序的元语言中的变量等
(2) 它们是变量,其值通常也是变量(比如用法:f(foo,bar)的值是foo和bar的和)。然而,有人认为,“metasyntactic 变量”流行的真正原因是它听起来不错。
换句话说,如果你创建一个文件,名字并不重要,通常就叫它'foo'。一旦你已经使用了'foo',那下个文件就叫'bar',再之后叫'baz'.再之后就有点不同了(“quux”是一个常见的选择),但是在大多数情境下3个就够了。
当我们使用命令行改变目录路径时,常用的方式是使用cd
(第四章中将会提到),然后马上用ls
命令查看该目录下的内容。这可以让我们定位自己,并且这也是我们操作下一步前好的开始。
ls
一个有用的功能是支持通配符*
(读做'星号')。例如,将所有后缀'.txt'的文件以列表形式展示出来,我们可以像这样输入:
$ ls *.txt
sonnet_1.txt
sonnet_1_reversed.txt
这里*.txt
(读作"星号点tee-ex-tee")自动匹配所有文件中名字是字符串后接着'.txt'的文件。
ls
有3个特殊且重要的可选操作选项,若以'长表单'开始,则使用-l
(读作‘短横线-ell’):
$ ls -l *.txt
total 16
-rw-r--r-- 1 mhartl staff 87 Jul 20 18:05 sonnet_1.txt
-rw-r--r-- 1 mhartl staff 294 Jul 21 12:09 sonnet_1_reversed.txt
现在,你可以放心地忽略ls -l
输出的大部分信息,但请注意,长表单列出了日期和时间,表示文件最后一次被修改的日期和时间。在日期前面的数字是文件的字节大小。
第二个非常有用的ls
变量是'以修改时间倒序列出文件信息(也是长表单)', 对应的命令是ls -rtl
,这会以最近修改时间在后面的顺序列出文件或目录的长表单(反转,即最近修改的文件或目录会出现在屏幕的下方,以便于检查)。当该目录下有许多文件,但你又只关心最近修改的文件时,用这个命令就非常方便,比如确认一个文件是否下载。我们将会在章节3.1中看到一个相关的例子,但你完全可以现在免费试试:
$ ls -rtl
<results system-dependent>
顺便说一下,-rtl
通常是这种紧凑的形式,但是你可以单独传入选项参数像这样:
$ ls -r -t -l
另外,它们间的顺序不相干,所以输入ls -trl
也会出现同样的效果。
隐藏文件
最后,Unix有‘隐藏文件(目录)’的概念,这些文件在用列表展示时默认不会显示出来。辨别隐藏文件或目录的方式是它们通常是以点'.'开始的文件或目录名,通常用于存储如用户偏好的内容。例如,在 Learn Enough Git to Be Dangerous中,我们创建了一个叫做.gitignore
的文件告诉一个特殊的程序(Git)忽略匹配某些模式的文件。一个具体的例子,忽略所有以'.txt'结尾的命名文件,我们可以这样做:
$ echo "*.txt" > .gitignore
$ cat .gitignore
*.txt
如果我们之后运行ls
, 这些文件不会再出现,因为它被隐藏了:
$ ls
sonnet_1.txt
sonnet_1_reversed.txt
为了用ls
命令显示隐藏的文件或目录,我们可以传入-a
选项(意为'all,所有'):
$ ls -a
. .gitignore sonnet_1_reversed.txt
.. sonnet_1.txt
现在,.gitignore
正如预期,显示在表单中了。(我们将在4.3章节中学习.
和..
的作用)。
练习
- 用什么命令可以列出以字母's'开头的非隐藏文件和目录?
2.用什么命令可以列出所有包含字符串'onnet'的非隐藏文件,并且以修改时间的倒序列出?备注:在前后都使用通配符。
3.用什么命令可以列出所有文件(包含隐藏文件),并以长表单,修改时间的倒序列出?