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中的输出内容只是个示例,具体结果会根据你用的系统有小的差异。(这对所有的例子都是一样,所以不用纠结于输出上的微小差别。)

插图15: 相当于`ls`的图形显示版本

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 footouch 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本身也在手册页中使用了foobar——这毫不含糊地证明了它在计算机中的地位。

那这些古老术语源自哪里?老办法, 查Jargon File(在上面输入foo),上面说:

foo: /foo/

  1. 感叹词. 表达厌恶、恶心。
  2. [非常常见] 常用做任何事物的示例名字,尤其是程序或文件(特别是临时文件)。
  3. 最开始在语法示例使用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章节中学习...的作用)。

练习

  1. 用什么命令可以列出以字母's'开头的非隐藏文件和目录?

2.用什么命令可以列出所有包含字符串'onnet'的非隐藏文件,并且以修改时间的倒序列出?备注:在前后都使用通配符。

3.用什么命令可以列出所有文件(包含隐藏文件),并以长表单,修改时间的倒序列出?

posted @ 2018-03-09 11:17  印前  阅读(465)  评论(0编辑  收藏  举报