UNIX 新手指南,第 1 部分: 文件维护工具

系统管理员可以在命令行中使用各种程序来维护 UNIX® 系统中的文件。在本教程中,您将试验使用一些命令,如 cdcptar,以便在命令行中导航 UNIX 文件系统并处理文件和目录。cd 命令用来更改目录,cp 命令用来复制文件或目录,而 tar 可以快速地对文件进行存档。您还将了解如何处理文件权限并执行简单的输入/输出。

Tim McIntire (tm@timmcintire.net), 咨询师, 自由撰稿人

Tim McIntire 是 Cluster Corporation 的咨询师和创始人之一,该公司是 HPCC 软件、支持和咨询的市场领跑者。他还定期向 IBM developerWorks 和 Apple Developer Connection 投稿。Tim 领导 Oceanography 的 Digital Image Analysis Lab 的 Scripps Institution 进行了计算机科学方面的研究工作,在各种期刊上发表了相关研究成果,包括 Concurrency and ComputationIEEE Transactions on Geoscience and Remote Sensing。您可以访问 TimMcIntire.net 以了解更多关于 Tim 的信息。



2007 年 1 月 18 日

开始之前

了解本教程中包含的内容以及如何最好地利用本教程。

关于本系列

这个由四部分组成的文章系列将从用户的角度出发,介绍 UNIX® 的基本知识。对于很久没有使用类 UNIX 操作系统的用户来说,这个初始的教程是个很好的温习。对于具有 Windows® 使用经验的新的 UNIX 用户来说,它也很有价值,因为其中引用了 Windows,并将两者进行了比较。本系列中后续的教程将详细介绍一些特定的应用程序(例如,vi),并讨论 Shell 的诀窍与技巧。

关于本教程

系统管理员可以在命令行中使用各种程序来维护 UNIX 系统中的文件。除了这里演示的基本程序外,还有更多的程序可供使用,但这里介绍的程序都是 UNIX 系统中的基本组成部分。您可以使用 mv 命令对文件和目录进行移动和重命名。cp 命令可以用来复制一个或多个文件或目录。有一个称为 tar 的应用程序,它可以快速地将文件聚集在一起形成一个存档。本教程还将讨论如何遍历文件系统、处理文件权限和简单的输入/输出,以便为新的 UNIX 用户顺利地使用系统而打下基础。

目标

本教程的目标是让新的 UNIX 用户能够熟练地使用命令行遍历系统和处理文件。它重点关注于用来操作文件的一些常用命令行实用程序,但同时也讨论了关于文件权限和输入/输出的内容,以便向您完整地介绍日常工作中需要使用的命令。

先决条件

要学习本教程,您需要对计算机和文件有基本的认识,但并不一定需要具备使用类 UNIX 操作系统的经验。您应该知道什么是目录(文件夹)和文件,并能够使用您的帐户登录到类 UNIX 操作系统中。如果您对 DOS 或 Microsoft® Windows 命令行比较熟悉,那么您将发现其中一些相似之处,但对于从未使用过这些命令行的用户来说,也可以顺利地学习本教程。

系统要求

在任何运行类 UNIX 操作系统的计算机上拥有您自己的帐户,这是完成本教程所需的要求。类 UNIX 操作系统包括 IBM AIX® 操作系统、Linux®、Berkeley Software Distribution (BSD) 和 Mac OS® X(通过终端来访问命令行),以及其他一些系统。


开始学习之前

在开始学习之前,有一点需要注意:目前可以获得许多不同的类 UNIX 分发版,从商业分发版(如 AIX)到免费的分发版(如 BSD 和 Linux)。本教程重点关注于所有分发版中都提供的一些命令和命令行选项,如果您发现与自己的分发版相比存在差异,那么请查看您的 man 页面(稍后将会进行描述)。

请根据您的选择,登录到相应的类 UNIX 操作系统,以便开始学习。在登录之后,您应该自动地开始于您的用户 home 目录中。本教程中的示例使用 tuser(测试用户)用户名。

man

在开始使用特定的命令之前,需要了解关于 man 的内容。man 表示手册 (manual),对于那些自信能够做到自给自足的 UNIX 用户来说,它是非常关键的工具。输入 man application-name 可以查看关于需要了解的内容的解释。在本教程的每个页面中,我们鼓励您在执行其中指令的同时,查看相应的 man 页面。

尝试输入下面的命令(请注意,$ 在本教程中表示命令提示符,在本教程的示例中,您应该在美元符号后面输入您所看到的内容):

$ man ls

目录

您需要了解的第一件事情是,如何遍历和查看文件系统。在 UNIX 中,目录用来以一种层次结构对文件进行组织。您可以在命令行中使用一系列的命令和列表来查看和遍历 UNIX 文件系统,而不要单击目录进入其中并且用图标来表示每个文件。

ls

如果您是第一次使用类 UNIX 操作系统,但是曾经使用过 DOS 或 Windows 命令行,那么 ls 基本上相当于 dir。它是列出目录 (List Directory) 的缩写。ls 可以与各种命令行选项一同使用,以便获得详细的列表、显示隐藏的文件、递归列出子目录,等等。请输入下面的示例:

$ ls 
$ ls -l 
$ ls -a 
$ ls -R

如果您正在命令行中考虑下一步应该进行什么操作,那么可以执行 ls,它可以帮助您了解现在所处的位置以及正在进行的操作。可以把它看作图形用户界面中的屏幕刷新操作,用来让您了解系统的当前状态。

cd

要遍历文件系统,可以使用 cd 来更改目录。输入 cd,然后输入您希望进入的目录的名称。如果在开头使用了 /,那么这个目录的名称是绝对 目录路径:它从文件系统的根开始。如果在开头没有使用 /,那么该目录是相对 路径:从您的当前工作 目录开始。例如,如果您位于自己的 home 目录 (/home/tuser),并且希望移动到某个子目录,可以在 cd 的后面输入希望进入的目录名称。例如,如果有一个 Documents 目录,那么您可以输入下面的命令:

$ cd Documents

因为您开始于 /home/tuser/,所以该命令将使您进入 /home/tuser/Documents/。

与此相反,您可以使用绝对路径名来指定一个位置。例如,如下所示,您可以移动到 /tmp,然后返回到您的 home 目录:

$ cd /tmp 
$ cd /home/tuser

特殊目录名称

在 UNIX 中,使用一些特殊的目录名称可以使得对文件系统的遍历变得简单。三个最重要的特殊名称分别指向当前目录、当前目录的父目录和用户的 home 目录。当前目录可以由点号指定。例如,如果您输入 $ cd .,那么您依然位于当前目录中,即 /home/tuser/。当您运行当前工作目录中的可执行文件时,该字符变得特别重要。在缺省情况下,许多 UNIX Shell 会在应用程序目录中搜索应用程序,但不会搜索当前工作目录。通常可以在文件名前面使用 ./,以显式地引用当前工作目录中的文件和应用程序。父目录由两个点号来引用。要遍历到您的当前工作目录的父目录,可以输入下面的命令:

$ cd ..

如果您以前位于 /home/tuser,那么现在就在 /home 中。为了演示第三个特殊目录名称,可以使用快捷方法返回您的 home 目录(波浪符号)。可以输入下面的命令:

$ cd ~

pwd

要查看当前目录,您可以使用 pwd,它表示打印工作目录 (Print Working Directory)。它可以告诉您现在位于文件系统中的何处,这将帮助您在指定相对路径名称时确定应该使用什么样的名称。请尝试使用这三种特殊目录名称、绝对路径和相对路径,以遍历您的文件系统。在每一步骤中,可以使用 pwd 查看当前位置。

查看当前目录(如果您执行了前面部分中的操作步骤,那么现在应该位于您的 home 目录):

$ pwd

mkdir、rmdir

mkdirrmdir 分别用来创建和删除目录。rmdir 仅当该目录为空有效(它并不删除文件)。

尝试使用下面的命令:

$ mkdir TUTORIAL 
$ cd TUTORIAL 
$ pwd 
$ ls

您现在位于刚刚创建的 TUTORIAL 目录,而且该目录为空。

您还可以使用 ~ 波浪号字符到达该目录。要进入 /home/tuser/TUTORIAL,可以输入:

$ cd ~/TUTORIAL 
$ pwd

目录布局

您已经了解了如何在目录中移动并获取清单,现在可以开始研究典型的 UNIX 分发版中的目录布局了。您可以通过几种不同的方式来组织 UNIX 文件系统。本教程讨论了一些在大多数类 UNIX 分发版中常见的根级目录。当然还有其他一些重要的根级目录,但下面这些是最常见的:

/home (or /users)
/etc
/bin
/sbin
/usr
/car
/tmp

/home 用来存放用户目录。例如,tuser 用户位于 /home/tuser。

/etc 是用来存储系统范围设置的目录,包括启动脚本和网络配置文件。该目录中的大多数文件都需要使用 root 用户进行编辑。

/bin 和 /sbin 是用来存储系统可执行文件(比如在本教程中学习的命令)的目录。/sbin 用于存放系统命令,如 shutdown,而 /bin 用于存放用户命令。

应用程序通常安装在 /usr 中。/usr/local/ 中的子目录通常用来包含一些安装的应用程序,而这些应用程序并不属于基本分发版中的一部分。

/var 是用来存放类似日志文件这样的内容的目录,需要不断地对其进行更新和存储。

临时文件存储在 /tmp 中。系统中所有的用户都可以对该目录进行写入,并且在一些系统中,会周期性地删除其中的旧文件。


文件

既然您已经知道了如何使用命令行在文件系统中移动,那么现在可以开始对文件进行处理了。本部分内容将介绍如何创建示例文件、复制文件、删除文件,以及查看和更改基本的文件权限。在像 UNIX 这样的多用户操作系统中,必须了解所有权和权限的概念。

touch

首先,创建一个空文件,您将在本教程中使用到该文件。touch 命令可以用来创建一个空文件(对文件使用 touch 命令,通常用来更新文件的修改日期和访问日期)。

返回到用户 home 目录中的 TUTORIAL 目录,并输入下面的命令创建一个文件:

$ cd ~/TUTORIAL
$ touch example.txt

cp

cp 命令用来复制文件。输入 cp 加上需要复制的文件的名称,再加上需要将该文件复制到的目录(您还可以使用相应的选项来指定新文件的名称)。例如,尝试将 example.txt 文件复制到 /tmp/:

$ cp example.txt /tmp/
$ ls /tmp/

您应该可以在 /tmp/ 中看到 example.txt。现在,将 /tmp/ 中的文件复制回您的当前目录,但是为它取一个新的名称:

$ cp /tmp/example.txt ./example2.txt
$ ls

请注意,这里使用一个点号来指定需要将这个新文件放到您的当前目录。在本示例中,不需要包括 ./(因为复制操作的缺省路径就是您的当前工作目录),但是它可以清楚地说明您要完成的任务。后面的 ls 命令则显示了在当前工作目录中有两个示例文件。

mv

移动(move)文件可以使用 mv 命令来完成。对于移动和复制操作来说,大多数语法和命令行选项都是相同的。如果您希望将新文件 example2.txt 移出当前目录并放入到 /tmp/,那么可以输入下面的命令:

$ mv example2.txt /tmp/.

请注意,这里再次使用了点号显式地说明您正在进行的操作。

rm

要对系统进行清理,可以删除在 /tmp/ 中创建的文件。rm 命令用来从文件系统中删除文件。这与将文件移动到回收站或垃圾箱不同,该命令删除了文件指针,所以在使用 rm 命令时应当格外小心。输入以下命令:

$ rm /tmp/example.txt
$ rm /tmp/example2.txt
$ ls /tmp/

/tmp/ 中的那两个示例文件都应该消失了。

根据您所使用的类 UNIX 操作系统的不同,您还可以使用其他的删除命令,如 srmcan。尝试输入 man srmman can 以查看是否存在这些命令。srm 用作安全版本的 rm,它对删除的文件使用随机数据进行覆盖,以防止对其进行恢复。can 在一些方法上与 srm 相反,can 可以保留文件,而将其移动到一个特殊的垃圾箱目录,类似于 Windows 的回收站。


所有权和权限

在类 UNIX 操作系统中,文件所有权和权限是非常重要的概念。UNIX 从一开始就是多用户的操作系统。尽管现在新版本的 Windows 也可以用作多用户系统,但如果追溯到早期的个人计算机和 DOS 时期,Windows 的祖先是单用户的。即使在今天,有些 Windows 用户也很少考虑多用户系统中关于多个帐户和文件权限的问题。对于 UNIX 用户来说,理解文件所有权和权限是至关重要的。

chown、chgrp

可以使用 ls -l 查看 UNIX 中的文件所有权,可以使用 chownchgrp 对其进行更改。输入下面的命令:

$ ls -l

使用 -l 指定需要查看长格式的文件清单。长格式包括关于权限、所有权、修改日期和文件大小等信息。您应该看到与下面所示类似的内容:

tsystem:~/TUTORIAL tuser$ ls -l
total 0
-rw-r--r-- 1 tuser admin 0 Aug 13 15:35 example.txt

当详细显示目录清单时,您可以分别在第 3 和第 4 列中看到文件的用户所有权和组所有权。该文件由 tuser 用户和 admin 组所有。现在,暂时不管这个文件,输入下面的命令可以得到更多的信息:

$ man chown
$ man chgrp

该命令的基本语法是使用用户名或组名作为第 1 个输入,后面是需要进行操作的文件或文件列表。例如:

$ chown tuser example.txt
$ chgrp admin example.txt

chmod

在 UNIX 中,使用与每个文件相关联的一组 9 个标志来处理基本文件权限。这些标志分别对应于不同用户类别(用户、组和其他用户)和三种文件操作(读取、写入和执行)。输入下面的命令:

$ ls -l

您应该看到与下面所示类似的内容:

-rw-r--r-- 1 tuser admin 0 Aug 13 15:35 example.txt

当您阅读目录的长格式清单时,其中的第 1 列显示了文件权限。请注意,该列中有 10 个字符(而不是 9 个)。第 1 个字符表示您正在处理的文件的类型。例如,短横线 -,告诉您这是一个常规文件。d 表示目录,而不是普通文件。现在,我们重点关注于其他的 9 个字符,每个字符可以为下列几种情况其中之一:-rwx。如果关闭了某个文件所有的权限,那么它应该与下面所示类似:

---------- 1 tuser admin 0 Aug 13 15:35 example.txt

如果打开了某个文件所有的权限,那么它应该与下面所示类似:

-rwxrwxrwx 1 tuser admin 0 Aug 13 15:35 example.txt

您可以看到 3 组 rwx。如前所述,有 3 种不同的用户类别(用户、组和其他用户)。每一组 rwx 对应于其中的一个类别:

  • 第 1 组 rwx 表示 user 的权限。换句话说,这可以告诉您,该文件的拥有者可以对其进行哪些操作。
  • 第 2 组对应于 group。这可以告诉您,组成员可以对该文件进行哪些操作。
  • 第 3 组对应于 other。这可以告诉您,系统中所有的用户可以对该文件进行哪些操作,无论该文件属于谁。

让我们更仔细地研究一下 example.txt 文件当前的权限:

-rw-r--r-- 1 tuser admin 0 Aug 13 15:35 example.txt

第 1 组三个标志表示该文件的所有者可以对其进行读取、写入操作,但是不能执行它(其中有 rw,但没有 x)。从第 2 组三个标志中您可以看出,拥有该文件的组可以对其进行读取,但不能写入或执行(其中有 r,但没有 wx)。第 3 组三个标志显示了,所有其他的用户可以读取该文件,但不能对其进行写入或执行操作(其中有 r,但没有 wx)。这里给出了一个很好的示例,说明了详细的 man 页面非常重要。您可以停下来,并输入下面的命令:

$ man chmod

现在,可以考虑一下这样的可能性,即该文件中保存了私有的信息,而您不希望任何其他的用户进行读取。您可能希望删除其他组和所有其他用户的读取权限。可以使用 chmod 更改这些权限。与 UNIX 中的许多操作一样,使用 chmod 的方法很多,本部分内容重点关注其中之一。使用三个字母(u、g 和 o)来表示三种类别(用户、组和其他用户)。使用三个字母(r、w 和 x)来表示三种权限(读取、写入和执行)。要更改这些权限,可以使用 chmod,加上需要更改的类别的字母,再加上一个加号或减号(分别表示打开或关闭),然后使用相应的字母给出需要更改的权限。最后,加上需要进行更改的文件的名称。最好通过一个示例来进行说明:

$ chmod og-r example.txt 
$ ls -l

您应该看到下面的结果:

-rw------- 1 tuser admin 0 Aug 13 15:35 example.txt

在这个示例中,您指定了其他用户和组(o 和 g),并使用减号表示希望对这些类别关闭某些权限。然后,使用 (r) 表示需要关闭读取访问权限。现在,文件的所有者 tuser 仍然可以对该文件进行读取和写入操作,但系统中所有其他的用户(除了超级用户之外)都不能访问该文件。注意:超级用户 (root) 可以重写所有的文件权限。


处理多个文件

现在,您已经了解了如何遍历目录和处理单个文件。本教程中的下一个内容是,了解如何处理一组文件。几乎所有的 UNIX 命令除了可以处理单个文件外,还可以处理文件列表。通过显式地输入需要使用的每个文件的名称,或使用通配符表示需要使用的、具有共同名称特征的所有文件,您可以输入文件的列表。

通配符

对于处理多个文件,最常用的方法就是使用 * 通配符。通过使用 * 来表示任何字符或任何数量的字符,您可以选择文件列表。为了创建更多的文件以进行演示,可以输入下列命令:

$ cp example.txt example2.txt
$ cp example.txt script.sh

现在,输入下面的命令:

$ ls *.txt

您应该仅看到扩展名为 .txt 的文件。接下来,输入:

$ ls exa*

这次,您应该看到两个示例文件,但不应该看到 script.sh。

任何能够处理多个文件的命令行应用程序都可以使用通配符。

递归

许多用来处理文件的命令行应用程序都具有一个 -R 选项。当使用了 -R 时,该应用程序将递归地进入一个目录及其所有的子目录,并且针对其中的每个文件执行所需的命令。例如,您可以返回您的 home 目录,然后复制整个 TUTORIAL 目录:

$ cd ~ 
$ cp -R TUTORIAL /tmp/. 
$ ls /tmp/TUTORIAL/

现在,可以删除该目录,以便对系统进行清理:

$ rm -R /tmp/TUTORIAL/ 
$ ls /tmp/

这就删除了整个目录,包括其中包含的所有文件。请注意:您可能会比原计划删除更多的数据,尤其是当通配符和 -R 一同使用时。


存档和压缩

许多日常的文件操作都可以使用单个文件、目录和通配符来完成,但对于那些对备份、将文件集传输给其他用户、或仅为了节省空间感兴趣的用户来说,了解如何使用存档和压缩是非常重要的。UNIX 操作系统中有许多用于存档和压缩数据的实用程序。

tar

要将多个文件聚集成单个文件(存档),最常用的方法是使用 tar 命令。tar磁盘存档程序 (Tape Archiver) 的缩写,这是因为它开始时使用备份磁带进行存档,但现在通常用来执行磁盘到磁盘的操作。尝试对 TUTORIAL 目录中的内容进行存档:

$ cd ~ 
$ tar cvf /tmp/tutorial.tar TUTORIAL 
$ ls /tmp/

现在,您应该可以在 /tmp/ 中看到一个名为 tutorial.tar 的文件。该文件包含了目录 TUTORIAL 以及这个目录中所包含的文件。这个示例中使用了命令行选项 cvf

  • c 表示创建 (create),它用来告诉 tar 创建一个新的存档。
  • v 表示详细 (verbose),它用来告诉 tar 显示加入到存档的每个文件的清单。
  • f 表示文件 (file),它用来告诉 tar 将存档写入到文件而不是设备。

然后,进入 /tmp 并提取该存档的内容:

$ cd /tmp/ 
$ ls 
$ tar cvf tutorial 
$ ls

请注意,第 1 个 ls 命令显示了 tutorial.tar,但它并没有显示 TUTORIAL 目录。第 2 个 ls 命令(在 tar 命令之后),它显示出在 /tmp/ 中有一个 TUTORIAL 目录。删除 /tmp/TUTORIAL 目录,以便对系统进行清理:

$ rm -R /tmp/TUTORIAL

gzip

在有了 tar 文件之后,您可能希望对其进行压缩。在大多数 UNIX 分发版中,有大量的压缩选项可供使用,但本教程重点关注于使用 gzip 来创建所谓的 tarball。tarball 是一个经过压缩的 tar 文件。下面让我们来创建一个压缩版本的 tutorial.tar,以使其占用更少的空间:

$ gzip tutorial.tar 
$ ls

现在,已经对 tutorial.tar 存档进行了压缩,并将其重命名为 tutorial.tar.gz。这是一个 tarball。要解压该文件,可以输入:

$ gzip -d tutorial.tar.gz

所得的结果是没有压缩的原始 tar 文件 tutorial.tar。


文件系统和文件的大小

可以很容易地了解如何处理单独的文件并查看它们的大小和内容。您可以使用相同的方法来查看整个目录和文件系统中的内容。许多新版本的 UNIX 可以使用简单的数值格式来显示该信息,并使用字母来表示相应的单位。

df

df 表示显示空闲 (Display Free) 磁盘空间。要使用该命令,可以简单地输入 df,您将获得关于计算机中每个文件系统的磁盘空间、已用空间和空闲空间的信息。在缺省情况下,大多数系统以 512KB 大小的块为单位进行显示,这将难以阅读。使用 -g 表示以千兆为单位显示信息,或使用 -m 表示以兆为单位显示信息。有些系统还提供了 -h 选项,它表示以人可读的 (human-readable) 的方式显示数据。这使得 df 使用像 G、M 和 K 这样的后缀,并且以 3 个或更少的位数来显示每个数值。输入下面的命令:

$ df -h

下面是在一台简单的服务器上可能看到的输出示例:

$ df -h 
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             7.9G  3.7G  3.9G  50% /
none                  3.9G     0  3.9G   0% /dev/shm
/dev/sda3              24G   20G  1.9G  92% /export

ls -lh

如果您的系统为 df 提供了 -h 选项,那么您还可以将其与 ls 一起使用。输入下面的命令以查看详细的清单,这样更容易阅读文件的大小:

$ ls -lh

du

du 是用来查看文件大小的第 3 种方法,但在汇总目录大小方面,它具有一定的优势。在有些系统中,它还可以与 -h 一同使用,否则可以尝试使用 -k,这将以 1024 字节大小的块为单位给出结果。您还可以使用 -s 和文件名或通配符,以指定需要查看哪个目录和文件。尝试下面的命令:

$ cd ~ 
$ du -sk * 
$ du -sh *

下面是在 home 目录中可能看到的输出示例:

$ du -sk * 
316468  OLD
637940  MyData1
571788  Code
12356364        Build
3224480 Hardened
$ du -sh * 
310M    OLD
623M    MyData1
559M    Code
12G     Build
3.1G    Hardened

/dev

/dev 目录中保存了一些称为设备文件 的特殊文件,这些文件与其他的内容一起,用来访问系统中的磁盘驱动器。要了解关于 /dev 目录的更多内容,可以再次查看 df 的输出。这在每台计算机上都不一样,但是请注意 df 显示的您的计算机上每个文件系统的结果。与基于 Windows 的计算机不同,每个已装入的文件系统都必须从系统的根目录开始编址,使用斜杠 / 来表示根目录。这与使用字母(如 C、D、E 等等)对磁盘进行区分的系统有所不同。

在 UNIX 中,通常 SCSI(和 SATA)磁盘都使用相应的设备名,如 /dev/sda、/dev/sdb、/dev/sdc 等等。CD-ROM 驱动器常用的设备名为 /dev/cdrom。将这些设备装入 到相应的目录,以便可以对它们进行访问,而无需使用设备名。请参考您的 UNIX 版本中的文档,以找出系统中设备的标记方式。

mount

任何设备都可以被装入到任何位置(任何目录)。例如,通常将 CD-ROM 装入到 /mnt/cdrom。有些类 UNIX 操作系统(如许多版本的 Linux 和 Mac OS)会自动地装入 CD-ROM,但最好还是了解一下如何使用 mount 命令。插入一张 CD-ROM,然后输入下面的命令:

$ mount -t iso9660 /dev/cdrom /mnt/cdrom
$ df
$ ls /mnt/cdrom

注意:这种方法仅当您的系统中存在 /dev/cdrom 和 /mnt/cdrom 时有效。如果它们的确存在,那么您将在 df 命令的输出中看到,CD-ROM 已成为文件系统中的一部分。ls 命令应该显示刚刚装入的 CD-ROM 驱动器中的内容。

umount

要卸载设备,大多数类 UNIX 操作系统使用 umount。其语法是 umount 加上装入点。如果以前成功地执行了 mount 命令,那么请输入下面的命令:

$ umount /mnt/cdrom
$ df
$ ls /mnt/cdrom

注意:要正确地卸载设备,您不能位于 已装入的文件系统中,否则,系统将提示该文件系统处于繁忙 状态。在正确地执行了 umount 之后,df 命令将不再显示文件系统中的 CD-ROM 驱动器,并且 ls 命令显示 /mnt/cdrom 现在为空(因为没有将任何内容装入到其中,它只是一个普通的目录)。


输入和输出

输入和输出通常被认为是简单的缺省终端:键盘/鼠标和显示器/扬声器。在 UNIX 中,通过访问系统的输入和输出流(以及错误流),使得用户和开发人员可以高效地对进出应用程序的输入和输出进行移动,这样做可以最大限度地减少人工交互,从而极大地降低处理过程的复杂程度。stdinstdoutstderr 是 UNIX 中重要的组成部分,并使其成为了理想的脚本编写平台。

stdin、stdout

大多数命令行应用程序可以从 stdin 接受输入,并输出到 stdoutstdin 表示标准输入stdout 表示标准输出。在缺省情况下,stdin 的输入来自键盘(即您在终端中输入的内容),而向 stdout 输出的结果将显示在屏幕上(即您在屏幕上所看到的内容)。另外还有一种输出类型,即 stderr,它用来打印错误和调试信息,但本教程重点关注于 stdinstdout

重定向

重定向允许用户将通常发送到 stdout 的输出发送到另一个目标,例如一个文件。使用下面的命令,可以创建一个包含 TUTORIAL 目录清单的文本文件:

$ cd ~/TUTORIAL 
$ ls > listing.txt 
$ ls

另一种形式的重定向是 >>,它将输出内容添加到文件的末尾,而不是创建一个新的文件。您还可以使用 2>stderr 重定向到文件,或者使用 &> 将所有的输出(stdoutstderr)重定向到文件。您可以组合使用各种形式的重定向,例如,使用 2>>stderr 添加到文件末尾。

cat

既然有个文件中包含了一些文本,那么让我们来看看其中的内容。查看文件内容的最快捷的方法是使用 cat 命令,它表示连接 (Concatenate),可以与重定向一起使用以连接文本。输入下面的命令:

$ cat listing.txt

如果您执行了本教程中的所有操作步骤,那么您应该看到与下面所示类似的内容:

example.txt 
example2.txt
listing.txt 
script.sh

more

前面的 cat 命令通常用于内容较少的文件,这样一来,您可以在一页中看到所有的数据。如果您正在查看一个文件,而该文件的内容超过了一页,那么通常可以使用 more 命令,它将在 stdout 中完整显示一页数据的时候暂停输出。按下空格键可以继续输出下一页。尝试创建一个较长的文件,以便作为示例:

$ ls /etc/ > listing2.txt
$ cat listing2.txt 
$ more listing2.txt

如果您使用 cat,那么该文件的内容将很快地滚过屏幕,而无法进行阅读,但如果使用 more,您可以按空格键一页一页地浏览输出内容。

head 和 tail

如果您需要快速地查看文件起始处或结尾处的若干行内容,可以使用 headtail。这些命令通常用来查看脚本中最前面的和日志文件中最后面的内容。当您在调试代码的时候,可以很方便地使用它们作为查看输出文件的方法。尝试输入下面的命令:

$ head listing2.txt

要查看文件结尾处若干行的内容,而不是起始处的若干行内容,可以尝试使用 tail

$ tail listing2.txt

通常在缺省情况下,这两个命令将显示 10 行内容,但是您可以使用 -n 选项,以便显示任何行数的内容。例如,输入下面的命令:

$ head -n 2 listing2.txt

grep

既然您正开始创建包含更多内容的文件,那么您可能希望从中搜索特定的文本。下面重要的示例中使用的 grep 是一种功能强大的搜索实用程序:

$ grep host listing2.txt

该命令输出 listing2.txt 中包含字符串 host 的所有行。

管道

要省略文件创建的步骤,您可以使用 pipe 字符 (|) 将一个命令的输出传递给另一个命令作为其输入。这是另一种形式的重定向,其功能非常强大,可用于连接一长串命令列表,以便高效地管理输入和输出。尝试这个简单的示例:

$ ls /etc/ | grep host

该命令与前面列出的两步操作得到同样的输出。这一行命令接受 ls 命令的输出,并将其作为 grep 命令的搜索输入。下面是另一个示例:

$ du -sh /etc/* | more

在这个示例中,查看了 /etc/ 中每个文件和目录的磁盘使用情况 (du)。输出结果超过一页,所以可以通过管道 (pipe) 将结果传递给 more,而后者每显示一页内容就会暂停输出。


总结

在学习完本教程后,您应该已经具备了在命令行中遍历 UNIX 文件系统和处理文件和目录的基本知识。您应该对本文列出的命令进行试验,而对于希望了解更多内容的项目,可以仔细地查看其 man 页面。

本系列中后续的教程将详细地讨论特定的应用程序(例如,vi),并介绍 Shell 的诀窍和技巧。同时,您可以使用测试用户进行各种试验。很快地,您就会喜欢上使用命令行选项进行工作,因为这比通过鼠标进行点击的速度更快!

参考资料

学习

获得产品和技术

  • IBM 试用软件:使用 IBM 软件开发您的下一个项目,可直接从 developerWorks 下载这些试用软件。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=189092
ArticleTitle=UNIX 新手指南,第 1 部分: 文件维护工具
publish-date=01182007