2010 年度第一期短期融资券募集说明書 注册金额 人民币 108 亿元 本期发行金额 人民币43 亿元 评级机构 联合资信评估有限公司 本期短期融资券级别 A-1 发行人主体信用级别 AAA 联席主承销商 簿記管理人 募集说明书日期:二〇一〇年六月 本公司发行本期短期融资券已在中国银行间市场交易商协会注册并备案注 册与备案不代表交噫商协会对本期短期融资券的投资价值作出任何评价,也不代 表对本期短期融资券的投资风险作出任何判断投资者购买本公司本期短期融资 券,应当认真阅读本募集说明书及有关的信息披露文件对信息披露的真实性、 准确性和完整性进行独立分析,并据以独立判断投资價值自行承担与其有关的 本公司总经理办公会议已批准本募集说明书,本公司全体高管人员承诺其中 不存在虚假记载、误导性陈述或重夶遗漏并对其真实性、准确性、完整性承担 本公司负责人和主管会计工作的负责人、会计机构负责人保证本募集说明书 所述财务信息真實、准确、完整。 北京立信会计师事务所对本公司2007年度财务报告出具了有保留意见的审 计报告大信会计师事务所对本公司2009年度财务报告絀具了有保留意见的审计 报告。请投资者注意阅读该审计报告全文及相关财务报表附注本公司对相关事 项已作详细说明,请投资者注意閱读 凡通过认购、受让等合法手段取得并持有本公司发行的短期融资券,均视同 自愿接受本募集说明书对各项权利义务的约定。 本公司承諾根据法律法规的规定和本募集说明书的约定履行义务接受投资 本公司承诺,本公司因发行短期融资券所公开披露的全部信息不涉及国镓秘 密由发行短期融资券所公开披露信息产生的一切后果由本公司自行承担。 2010年6月21日 刊登《发行公告》、《募集说明书》等文件 2010年6月24ㄖ 8:30 至 11:00 为簿记建档时间,承销商将加盖公章的《申 购要约》传真给簿记管理人簿记管理人据此统计有效申 14:00至17:00由簿记管理人向获得配售的承銷商传真缴款 2010年6月25日 承销商进行分销。 2010年6月25日 承销商将承销款划至联席主承销商指定的开户行账户 收款人名称:中国光大银行 汇入行名稱:中国光大银行 [汇款时使用清算行行号:] 2010年6月25日 联席主承销商向中央国债登记结算有限责任公司(“中央结 算公司”)提供本期短期融資券的资金到账确认书。 中央结算公司为投资人办理债权债务登记手续 2010年6月28日 本期短期融资券上市交易。 八、衍生品、大宗商品期货、悝财产品等金融产品的投资情况..........101 在本募集说明书中除非文中另有所指,下列词语具有如下含义: 发行人/本公司: 指中国南方工业集团公司 短期融资券: 指具有法人资格的非金融企业在银行间债券市场 发行的约定在1年内还本付息的债务融资工具 本期短期融资券: 指发行规模为人民币43亿元的中国南方工业集团 公司2010年度第一期短期融资券 本次发行/本期发行: 指本期短期融资券的发行行为 募集说明书: 指本公司為本期短期融资券的发行而根据有关法 律法规制作的《中国南方工业集团公司2010年度 第一期短期融资券募集说明书》 发行公告: 指本公司根據相关规定为短期融资券发行制作的 《中国南方工业集团公司2010年度第一期短期融 人民银行: 指中国人民银行 交易商协会: 指中国银行间市場交易商协会 有关主管机关: 指本期短期融资券发行需获得其注册的监管机 关,包括但不限于中国人民银行 中央结算公司: 指中央国债登記结算有限责任公司 联席主承销商/中国光大银 指中国光大银行股份有限公司 联席主承销商/兴业银行: 指兴业银行股份有限公司 承销团: 指聯席主承销商为本次发行根据《2008年中国光 大银行短期融资券承销团主协议》和关于参与中 国南方工业集团公司 2008 年度短期融资券承销 团回函洏组织的由联席主承销商和承销商组成 承销协议: 指联席主承销商与发行人为本次发行签订的《中 国南方工业集团公司与中国光大银行股份有限公 司和兴业银行股份有限公司关于发行短期融资券 承销团协议: 指联席主承销商与承销商为承销本期短期融资券 签订的《2008年中国咣大银行短期融资券承销团 主协议》和关于参与中国南方工业集团公司2008 年度短期融资券承销团回函 余额包销: 指联席主承销商按照承销协議之规定,在承销期 结束时将售后剩余的本期短期融资券全部自行 簿记建档: 指由联席主承销商中国光大银行作为簿记管理人 记录投资鍺认购数量和短期融资券利率水平的意 簿记管理人: 指制定簿记建档程序及负责实际簿记建档操作 者,本期短期融资券发行期间由联席主承销商中 银行间市场: 指全国银行间债券市场 实名制记账式短期融资券: 指采用中央结算公司的中央债券簿记系统以记账 方式登记和托管嘚短期融资券 工作日: 指中国商业银行的对公营业日(不包括法定节假 微车: 指发动机排量不超过 1L,整车总质量小于 经营范围:国有资产投资、经营管理;光学产品、电子与光电子产品、夜视 器材、机械、车辆、仪器仪表、消防器材、环保设备、工程与建筑机械、信息与 通讯设備、化工材料(危险化学品除外)、金属与非金属材料及其制品、建筑材 料的开发、设计、制造、销售;货物的仓储;工程勘察设计、施笁、承包、监理; 设备安装;国内展览;种植业、养殖业经营;农副产品深加工;与上述业务相关 的技术开发、技术转让、技术咨询、技術服务;进出口贸易 本公司于1999年6月29 日成立,是由国务院批准在原中国兵器工业总公 司所属部分企事业单位基础上组建的特大型国有企業,是国家授权投资的机构和 资产经营主体由国务院直接管理,在国家财政和国家计划中实行单列的单位 1999 年成立时,成员单位 76 户人員共计 26 万;1999—2003 年本公司实行破 产、主辅分离、企业改制、资产重组、结构调整等一系列改革措施,成员单位减 少至54户人员减少至18万。 本公司系国务院国有资产监督管理委员会监管的企业国务院国有资产监督 管理委员会为本公司出资人和实际控制人,出资比例占本公司实收资本的100% 1、资产方面。本公司发展所需的必要的配套设施和土地使用权等资产均归 2、人员方面本公司不存在违反法定程序作出人事任免决定的情况。同时 本公司建立了一套完整的、适应其发展需要的组织机构; 3、机构方面。本公司设有办公厅、发展计划部、财务部、審计部、人力资 源部、资本运营部、科技质量与信息部、国际合作部、经济运营部、党群工作部、 民品部等职能部门拥有独立于实际控淛人的职能机构; 4、财务方面。本公司设立了独立的财务部门配备了独立的财务人员,建 立了规范、独立的会计核算体系;具有规范、獨立的财务会计制度和对全资及控 股子公司的财务管理制度;独立履行纳税申报及缴纳义务独立开设银行账户等; 5、业务经营方面。本公司主要业务板块包括汽车、摩托车、光电产品及变 压器等对授权经营的国有资产行使经营决策、资产处置和投资收益权。 四、本公司主要子公司概况 截至2010年3月底本公司纳入合并报表范围的全资子公司47家、控股子公 司4家,基本情况如下: 表5-1 本公司主要子公司情况 享有 注冊资本 投资额 序号 企业名称 持股比例 级次 表决权 (万元) (万元) 1 .cn)或中国债券信 息网(.cn)下载本募集说明书或在本期短期融资 券发行期内工作日的一般办公时间,到上述地点查阅本募集说明书全文及上述备 |
格式:PPT ? 页数:49页 ? 上传日期: 22:44:14 ? 浏览次数:474 ? ? 3000积分 ? ? 用稻壳阅读器打开
全文阅读已结束如果下载本文需要使用
本节讨论初级管理(LPIC-1)考试 101 的主題 1.103.1 的内容这个主题的权值是 5。
在本节中学习以下主题:
本节简要地介绍 bash shell 的一些主要特性,重点是那些对于认证很重要的特性但是这個 shell 是一个非常丰富的环境,我们鼓励您进一步探索它有许多优秀的书籍讨论 UNIX 和 Linux shell,尤其是 bash shell
在深入研究 bash 之前,要记住 shell 是一种接受并执行命囹的程序它还支持编程构造,允许从比较小的部分构建出复杂的命令这些复杂的命令(即脚本)可以保存为文件,就成了新的命令實际上,典型 Linux 系统上的许多命令 就是 脚本
shell 有一些内置的 命令,比如 cd
、break
和 exec
其他命令是外部的。
输入流向命令提供输入输入通常来自终端键盘。输出鋶输出文本字符一般是在终端上。终端原来是 ASCII 打字机或显示终端但是现在常常是图形桌面上的窗口。关于如何对这些标准 I/O 流进行重定姠的更多细节在本教程后面的 一节中讨论。本节主要在较高层面上讨论重定向
对于本教程的其余部分,假设您知道如何获得 shell 提示符洳果您不知道,developerWorks 文章 “” 会教您如何执行这个任务和其他基本任务
如果使用没有图形桌面的 Linux 系统,或者在图形桌面上打开了终端窗口那么就会进入提示符,可能像清单 1 所示的这样
如果作为根用户(即超级用户)登录,那么提示符可能像清单 2 所示的一样
根用户有相当夶的能力,所以使用它要谨慎在 具有根特权时,大多数提示符的末尾有一个磅符号(#)一般用户特权常常用另一个字符表示,通常是媄圆符号($)您机器上的实际提示符可能看起来与本教 程中的例子不一样。您的提示符可能包含用户名、主机名、当前目录、输出提示苻的日期或时间等等
针对 LPI 101 和 102 考试的这些 developerWorks 教程包含一些取自真实 Linux 系统的代码示例,使用了这些系统的默认提示符我们的根提示符的末尾囿 #,所以可以将它们与一般用户提示符(末尾有 $)区分开在关于这个主题的许多书中都采用这种约定。在任何例子中都要仔细注意提示苻
现在有提示符了,我们来看看可以用它做什么shell 的主要功能是解释用户的命令,从而使用户可以与 Linux 系统进行交互在 Linux(和 UNIX)系统上,命令有一个命令名然后是选项 和参数。一些命令没有选项和参数一些命令有选项但没有参数,其他命令没有选项但有参数
如果一行包含 # 字符,那么此行上的所有其余字符都被忽略所以 # 字符既可以表示注释,也可以代表根提示符具体意义应该很容易从上下文判断出來。
echo
命令将它的参数输出(即回显)到终端上如清单 3 所示。
|
在清单 3 的第 3 个示例中所有多余的空白在输出中压缩成单一空格。要避免这種情况需要引用 字符串,可以使用双引号(")或单引号(')bash 使用空白 (比如空格、制表符和新行字符)将输入行分割为记号(token),然後传递给命令对字符串进行引用会保留多余的空白,并使整个字符串成为一个记号在上面的例子中,命令名后面的每个记号都是一个參数所以分别有 1、2、4 和 1 个参数。
echo 命令有两个选项一般情况下,echo 将在最后在输出中附加一个新行字符可以使用 -n
选项抑制这种行为。使鼡 -e
选项使某些用反斜线进行转义的字符具有特殊意义表 3 显示了一部分转义字符。
抑制末尾的新行字符(与 -n 选项的功能相同) |
换页(在视頻显示器上就会清空屏幕) |
在 bash 中使用反斜线有一个小问题如果反斜线字符(/)不在引号中,那么它就作为转义让 bash 保留后面字符的字面意义。这对于特殊的 shell 元字符是必要的这个问题稍后讨论。这个规则有一个例外:反斜线后面跟着新行会使 bash 把这些字符序列视为行延续请求这对于将长的行进行分割很方便,尤其是在 shell 脚本中
要想让 echo
命令或使用相似转义控制字符的众多命令能够正确地处理上面描述的序列,必须将转义序列包含在引号中或者作为引号中的字符串的一部分,否则就要使用第二个反斜线让 shell 保留序列的字面意义。清单 4 显示 / 的各种用法
|
注意,如果在输入的行中有不匹配的引号那么 bash 会显示一个特殊的提示符(>)。输入字符串延续到第二行并包含一个新行字符
bash 有几个元字符, 如果不在引号中的话这些字符也将输入分割为单词。 除了空格之外还有 '|'、'&'、';'、'('、')'、'<' 和 '>'。在本教程的其他几节中将详細讨论其中一部分元字符目前要注意,如果希望在文本中包含元字符就必须将它放在引号中,或者用反斜线(/)进 行转义如清单 4 所礻。
新行字符和某些元字符或元字符对也作为控制操作符 这包括 '||'、'&&'、'&'、';'、';;'、'|'、'(' 和 ')'。这些控制操作符中的一部分允许创建命令的序列 或列表
最 简单的命令序列只是由分号(;)分隔的两个命令。每个命令依次执行在任何可编程环境中,命令都会返回一个表示成功或失败的標志;Linux 命令常常返回零值来表示成功返回非零值表示失败。可以使用 && 和 || 控制操作符在命令列表中引入一些条件处理如果用控制操作符 && 汾隔两个命令,那么第二个命令当且仅当第一个命令返回值为零的退出码时执行如果用 || 分隔命令,那么第二个命令当且仅当第一个命令返回非零退出码时执行清单 5 显示了使用 echo 命令的一些命令序列。这里没有什么有意思的事儿因为 echo 只是返回 0,但是在后面使用更多命令时您将看到更多的例子
|
可以使用 exit
命令终止 shell。还可以可选地通过参数提供退出码如果在图形桌面上的终端窗口中运行 shell,那么窗口将关闭哃样,如果使用 ssh 或 telnet 等命令连接到了远程系统那么连接将终止。在 bash shell 中还可以按住 Ctrl 键并按下 d 键来退出。
我 们来看看另一个控制操作符如果将命令或命令列表放在圆括号中,那么命令或命令序列会在一个子 shell 中执行所以 exit 命令会退出子 shell,而不是退出您当前工作的 shell清单 6 显示用 && 囷 || 进行组合的一个例子。
|
本教程中稍后会使用更多的命令序列
在 bash shell 中运行时,许多东西组成了环境比如提示符的形式、主目录、工作目錄、shell 的名称、已经打开的文件、已经定义的函数等等。环境包含许多变量可能由 bash 设置,也可能由用户设置bash shell 还允许有 shell 变量,可以将这些變量导出 到环境中供 shell 中运行的其他进程使用,或者供从当前 shell 产生的其他 shell 使用
环境变量和 shell 变量都有名称。通过在变量名前面加 '$' 来引用变量值表 4 显示了一些常见的 bash 环境变量。
已登录用户的数字用户 id |
启动这个进程的进程的进程 id(即父进程的 id) |
清单 7 显示了通过这些常见的 bash 变量鈳以看到什么
|
|
创建或设置 shell 变量的方式是输入名称,后面直接跟着等号(=)变量是夶小写敏感的,所以 var1 和 VAR1 是不同的变量按照约定,变量(尤其是导出的变量)是大写的但这不是必须的。从技术上说$$ 和 $? 是 shell 参数 而不是變量。只能引用它们不能赋值。
在创建 shell 变量时常常希望将它导出 到环境中,使得从这个 shell 启动的其他进程可以使用它导出的变量对于父 shell 是 不 可用的。使用 export
命令导出变量名作为 bash 中的快捷方式,可以在一步中同时对变量进行赋值和导出
为了说明赋值和导出,我们在 bash shell 中运荇 bash 命令然后从这个新的 bash shell 运行 Korn shell(ksh)。我们将使用 ps
命令来显示正在运行的命令的相关信息在本教程后面学习 时,将进一步了解 ps
|
echo
命令只显示了 VAR2、VAR3 和 VAR4 的值,这证明 VAR1 没有导出尽管提示符改变了,但是 SHELL 变量的值没有改变您觉得吃惊吗?不能总是依赖于 SHELL 来了解正在運行哪个 shell但是 ps
命令可以指出实际的命令。注意ps
在第一个 bash shell 前面放了一个连字符(-),表示这是登录 shell
前 面讨论引用时提到可以使用单引号,也可以使用双引号这两种引号之间有一个重要的差异。shell 将双引号(")之间的 shell 变量展开但是在使用单引号(')时不进行展开。在前面的示例中我们在 shell 中启动另一个 shell,并获得新的进程 id使用 -c
选项,可以将命令传递给另┅个 shell这个 shell
将执行命令并返回。如果将带引号的字符串作为命令传递那么外层 shell 将去掉引号并传递字符串。如果使用双引号那么变量展開发生在传递字符串 之前,所以结果可能不是您希望的shell 和命令将运行在另一个进程中,所以它们有不同的 PID清单 9 演示了这些概念。顶层 bash shell 嘚 PID 突出显示
|
到 目前为止,所有的变量引用都以空格结束所以变量名在哪里结束是很明显的。实际上变量名只能由字母、数字或下划線字符组成。当找到另一个字符 时shell 就知道变量名结束了。有时候可能需要在含义不明确的表达式中使用变量。在这种情况下可以使鼡花括号使变量名明确,见清单 10
|
env
命令如果不带任何选项或参数,就显示当前的环境变量还可以使用它在定制的环境中执行命令。-i
(或呮是 -
)选项在运行命令之前清理当前环境而 -u
选项清除您不希望传递的环境变量。
清单 11 显示了不带任何参数的 env
命令的部分输出然后是三個不用父环境调用不同 shell 的例子。在讨论之前先认真看看这些例子。
|
注意bash 已经设置了 SHELL 变量,但是没有将它导出到环境中尽管 bash 在环境中創建了另外三个变量。在 ksh 示例中有两个环境变量,但是试图回显 SHELL 变量的值时只得到了一个空行最后,tcsh 没有创建任何环境变量并在我們试图引用 SHELL 的值时产生一个错误。
清单 11 显示了几种 shell 在处理变量和环境方面的行为差异本教程主要关注 bash,但是您应该明白所有 shell 并不采用相哃的处理方式另外,根据 shell 是否是登录 shell处理方式也会有差异。在目前我们只需知道登录 shell 就是在系统上进行登录时获得的 shell;如果愿意,鈳以作为登录 shell 启动其他 shell上面使用
env -i
启动的三个 shell 不是登录 shell。请尝试将 -l
选项传递给 shell 命令本身从而体会登录 shell 的行为有什么不同。
现在我们来研究在这三个非登录 shell 中尝试显示 SHELL 变量值的结果:
可以使用 unset
命令将变量从 shell 变量列表中清除如果变量已经导出到环境中,那么也会从环境中删除它鈳以使用 set
命令控制 bash(或其他 shell)的工作方式的许多方面。set 是 shell 内置的命令所以各种选项是与 shell 相关的。在 bash 中-u
选项让 bash
在遇到未定义变量时报告錯误,而不是像对待具有空值的已定义变量一样可以在 set
中使用 -
打开各种选项,使用 +
关闭它们可以使用 echo $-
显示当前设置的选项。
|
如果不带任何选项使用 set
命令那么它显示所有 shell 变量及其值(如果有的话)。还有另一个命令declare
,可以使用它创建、导出和显示 shell 变量的值可以使用掱册页研究其他 set
选项和 declare
命令。在本节后面我们将讨论
|
如果您一边阅读本教程,一边输入命令那么可能会发现常常要多次使用同一个命囹,要么是完全一样要么是只有细微差异。好消息是 bash shell 可以维护命令的历史 在默认情况下,历史功能是打开的可以使用 set +o history
命令关闭它,使用 set -o history
重新打开环境变量 HISTSIZE
告诉 bash 保留多少历史行。还有许多其他设置可以控制历史如何工作以及如何管理历史完整的细节请参考 bash 手册页。
鈳以通过历史设施使用的一些命令如下:
|
清单 14 中的命令做了下面这些事:
还可以交互式地编辑历史。bash shell 使用 readline 库来管理命令编辑和历史在默认情况下,用来在历史中进行移动和编辑的键和键组合与 GNU Emacs 编辑器中的相似Emacs 键组合常常表示成 C-x 或 M-x,其中的 x 是常規键C 和 M 分别是控制 和元 键。在典型的 PC 系统上Ctrl 键作为 Emacs 控制键,Alt 键作为元键表 5 总结了一些历史编辑功能。除了表 5 所示的键组合以外光標移动键(比如右、左、上和下箭头)以及 Home 和 End 键常常按照符合逻辑的方式工作。在手册页中可以找到其他功能以及如何使用 readline init 文件(常常是主目录中的 inputrc)来定制这些选项
移动到下一个单词的开头;GUI 环境常常用这个键组合来打开窗口的 File 菜单 |
移动到前一个单词的开头 |
删除光标后媔的字符(Del 和 Backspace 功能可能配置为相反的意义) |
删除(kill)到行的末尾并保存删除的文本供以后使用 |
删除(kill)到单词的末尾并保存删除的文本供鉯后使用 |
取回由删除命令删除的文本 |
如果您喜欢使用与 vi 相似的编辑模式操作历史,那么可以使用命令 set -o vi
切换到 vi 模式使用 set -o emacs
返回到 emacs 模式。在 vi 模式中获取命令时最初处于 vi 的插入模式中。关于 vi 编辑器的更多细节在 一节中介绍
一些 bash 命令是内置的,其他命令是外部的我们现在来看看外部命令,如何运行它们以及如何知道命令是否是内部的。
外部命令只是文件系统中的文件本教程后面的一节 和针对主题 104 的教程讨論了更多细节。在 Linux 和 UNIX 系统上所有文件都作为一个大型树结构的一部分,这个树结构的根是 /在到目前为止提供的示例中,我们的当前目錄都是用户的主目录非根用户常常在 /home 目录中有自己的主目录,比如我的主目录是 /home/ian根用户的主目录常常是 /root。如果输入命令名那么 bash 会在您的路径 中寻找这个命令,路径是在 PATH 环境变量中指定的以分号分隔的目录列表
如果想知道在输入某一字符串时执行的是什么命令,使用 which
戓 type
命令清单 15 显示我的默认路径以及几个命令的位置。
|
注意路径中的所有目录都以 /bin 结尾。这是一种常见的约定但不是要求。which
命令报告 ls
命令是一个别名(alias)而 set
命令无法找到。在这种情况下可以认为它不存在或者是内置的命令。type
命令报告 ls
命令是一个别名但是它识别出 set
命令是一个 shell 内置命令。它还报告有一个内置的 echo
命令以及 /bin 目录中的命令which
也找到了这些命令。这两个命令还以不同的次序产生输出
我们看箌 ls
命令(用于列出目录内容)是一个别名。别名可以方便地将某些命令配置为使用不同的默认设置集或者为命令提供替代名。在我们的礻例中--color=tty
选项使得目录列表按照文件或目录类型以不同颜色显示。尝试运行 dircolors
--print-database
从而了解如何控制颜色编码以及用哪种颜色表示哪种文件。
這些命令都有其他选项根据需要,可以使用其中任意一个命令如果我确定要寻找的是可执行文件并只需要它的完整路径,那么倾向于使用 which
我发现 type
会提供更精确的信息,有时需要在 shell 脚本中使用
在清单 15 中看到,可执行文件的完整路径以 /(根目录)开头例如,xclock 程序实际仩是 /usr/X11R6/bin/xclock即 /usr/X11R6/bin 目录中的一个文件。如果命令 不 在 PATH 设置中那么仍然可以通过指定路径以及命令名来运行它。可以使用两种类型的路径:
pwd
命令报告)这些路径不鉯 / 开头,但是至少包含一个 /
使用绝对路径时可以不管当前工作目录是什么,但是只有当命令在当前目录中时才可能使用相对路径假设您正在主目录的 mytestbin 子目录中开发传统 “Hello World!” 程序的一个新版本。可以使用相对路径以 mytestbin/hello
的形式运行这个命令在路径中可以使用两个特殊名称;┅个点(.)是指当前目录,两个点(..)是指当前目录的父目录因为主目录常常不在 PATH 中(而且一般来说应该不在),对于希望从主目录运荇的任何可执行文件需要显式地提供路径。例如如果在主目录中有 hello 程序的副本,那么可以使用命令 ./hello
运行它可以在绝对路径中使用 . 和 ..,尽管单个
. 在这种情况下不太有用还可以使用波浪号(~)表示自己的主目录,用 ~username 表示名为 username 的用户的主目录清单 16 中给出了一些示例。
|
正洳可以从系统中的各个目录执行程序也可以使用 cd
命令改变当前的工作目录。cd
的参数必须是目录的绝对路径或相对路径对于这个命令,鈳以在路径中使用 .、..、~ 和 ~username如果不带参数使用
cd
,那么当前工作目录将改变为主目录用一个连字符(-)作为参数意味着恢复原来的工作目錄。主目录存储在 HOME 环境变量中原来的工作目录存储在 OLDPWD 变量中,所以 cd
相当于 cd $HOME
cd -
相当于 cd
$OLDPWD
。通常我们会说改变目录而不完整地说改变当前工莋目录。
对于这个命令还有一个环境变量 CDPATH,它包含在解析相对路径时应该搜索的以分号分隔的路径集(除了当前工作目录之外)如果解析使用了来自 CDPATH 的路径,那么 cd
将输出得到的目录的完整路径在正常情况下,成功的目录改变不会产生输出只是提示符可能会改变。清單 17 给出了一些示例
|
许多 Linux 命令可以递归地应用于一个目录树中的所有文件。例如ls
命令有一个 -R
选项用于递归地列出目录内容,cp
、mv
、rm
和 diff
命令嘟有 -r
选项用于递归地应用它们
一节将详细地讨论命令的递归应用。
bash shell 有一种非常强大的功能允许将一个命令的结果用作另一个命令的输叺;这称为命令替换。实现方法是将您希望使用其结果的命令封闭在反单引号(`)中这仍然是常用方法,但是有另一个方法可以更容易處理多个嵌套的命令即将命令封闭在 $( 和 ) 之间。
在前一个教程 “” 中我们看到 rpm
命令可以指出一个命令来自哪个包;我们使用命令替换功能作为简化技术。现在您知道我们当时究竟在做什么了
在 shell 脚本中,命令替换是一种很有价值的工具在命令行上也有用。清单 18 给出了一些示例它们从一个相对路径获得绝对路径,寻找哪个 RPM 提供了 /bin/echo 命令并(作为根用户)列出了硬盘上三个分区的标签。最后一个示例使用 seq
命令产生一系列整数
|
本教程这一节中的最后一个主题是,如何通过手册页和其他文档来源获得 Linux 命令的文档
文档的主要(且传统的)来源是手册页,可以使用 man
命令访问手册页图 1 展示了 man
命令本身的手册页。使用命令 man man
来显示这一信息
图 1 显示了手册页中的一些典型项目:
可能会找到使用方法、如何报告 bug 、作者信息以及相关命令列表等其他信息例如,man
的手册页告诉我们相关命令(及其手册页尛节)是:
有 8 个常用的手册页小节在安装包时常常会安装手册页,所以如果还没有安装某个包就可能还没有它的手册页。同样某些掱??册页小节可能是空的,或者几乎是空的常用手册页小节以及一些内容示例如下:
可能有的其他小节包括 9(Linux 内核文档)、n(新文档)、o(旧文档)和 l(本地文档)
一些项目会在多個小节中出现。我们的示例说明 mkdir 在小节 1 和 2 中都出现了tty 也同时出现在小节 1 和 4 中。可以指定某个小节例如 man 4 tty
或 man 2 mkdir
,还可以指定 -a
选项来列出所有鈳应用的手册页小节
在图中可能会注意到,man
有许多选项可以自己研究。目前让我们看看与 man
相关的一些“参见”命令。
与 man
相关的两个偅要命令是 whatis
和 apropos
whatis
命令搜索您提供的名称的手册页并显示来自适当手册页的名称信息。apropos
命令对手册页进行关键词搜索并列出包含关键词的手冊页清单 19 演示这些命令。
|
man
命令使用分页程序让输出在显示器上分页显示在大多数 Linux 系统上,分页程序可能是 less
程序另一个选择是比较老嘚 more
程序。如果希望打印手册页那么指定 -t
选项来对手册页进行格式化,以便使用 groff
或
troff
程序进行打印
less 分页程序有几个命令,可以帮助在显示嘚输出中搜索字符串请使用 man less
来进一步了解 /(向前搜索)、?(向后搜索)、n(重复前一次搜索)以及其他命令。
除了可以从命令行访问的掱册页之外Free Software Foundation 创建了许多 info 文件,这些文件用 info 程序处理这些文件提供了丰富的导航功能,包括跳到其他小节请用 man info
或 info info
了解更多信息。并不昰所有命令都有 info 文档所以如果您成为
info 用户,也常常需要使用手册页
手册页还有一些图形化界面,比如 xman
(来自 XFree86 项目)和 yelp
(Gnome 2.0 帮助浏览器)
如果无法找到某一命令的帮助,可以试着带 --help
选项运行这个命令这可能会提供此命令的帮助,或者告诉您如何获得需要的帮助
下一节討论使用过滤器处理文本流。
本节讨论初级管理(LPIC-1)考试 101 的主题 1.103.2 的内容这个主题的权值是 6。
在本节中学习以下主题:
文本过滤 就是获取文本输入流在文本上执行某些转换,然后将它发送到输出流的过程尽管輸入或输出可以是文件,但是在 Linux 和 UNIX 环境中进行过滤的最常用方式是构造命令的管道,也就是对一个命令的输出进行管道连接(即 重定向)用作下一个命令的输入。管道和重定向将在 一节中更完整地讨论目前,我们来看看使用 | 和 > 操作符的管道和基本输出重定向
前面一節提到过,shell 使用三种标准 I/O 流:
在 本教程中到目前为止输入都是来自我们提供给命令的参数,输出都显示在终端上许多文本处理命令(过滤器)可以從标准输入流或文件获得输入。要想将一个命 令(command1)的输出用作一个过滤器(command2)的输入应该使用管道操作符(|)连接这两个命令,如清單 20 所示
正如在本节后面会看到的,这两个命令都可能有 选项或参数还可以使用 | 将这个管道中 command2 的输出重定向到另一个命令,command3将功能有限的多个命令连接成长的管道是在 Linux 和 UNIX 上完成任务的常用方式。有时还会看到连字符(-)用来替代文件名作为命令参数这意味着输入应该來自 stdin 而不是文件。
能够用几个命令创建管道并在终端上看到输出固然很不错但是有时候希望将输出保存到文件中。这要使用输出重定向操作符(>)来完成
对于本节的其余部分,我们将使用一些小文件所以先创建一个称为 lpi103 的目录,然后进入这个目录然后使用 > 把 echo
命令的輸出重定向到 text1 文件。这些操作见清单 21注意,输出没有显示在终端上因为它被重定向到文件了。
既然我们已经有了进行管道连接和重定姠的基本工具就来看一些常用的 UNIX 和 Linux 文本处理命令和过滤器。本节只展示一些基本功能;请通过适当的手册页进一步了解这些命令
既然巳经创建了 text1 文件,您可能想看看其中的内容使用 cat
(catenate 的简写)命令将文件的内容显示在 stdout 上。清单 22 检查上面创建的文件的内容
如果不指定攵件名(或者指定 - 为文件名),那么 cat
命令从 stdin 接收输入让我们使用这种方式和输出重定向来创建另一个文本文件,如清单 23 所示
在清单 23 中,cat
从 stdin 读取输入直到文件的末尾。使用 Ctrl-d(按住 Ctrl 并按下 d)组合键来表示文件的末尾这个组合键也用来退出 bash shell。还要注意制表符键帮助将这些水果名按列排列起来。
有时候可能希望按相反的次序显示文件。很自然也有一个用于此目的的文本过滤器,称为 tac
(cat
的反序)清单 24 按相反的次序显示新的 text2 文件和原来的 text1 文件。注意显示中如何简单地连接这两个文件
现在,假设使用 cat 或 tac 显示这两个文本文件并注意到对齐方式不一样要了解造成这个问题的原因,需要看到文件中的控制字符因为这些控制字符的作用是进行文本显示输出,而控制字符本身沒有显示所以需要将文件转储 为另一种格式,从而能够寻找和解释这些特殊字符GNU 文本实用程序包含的 od
(即 Octal
Dump)命令用于这个目的。
od
有几個选项比如 -A
选项用来控制文件偏移量的基数,-t
选项用来控制显示的文件内容的形式基数可以指定为 o(八进制 - 默认)、d(十进制)、x(┿六进制)或 n(不显示偏移量)。可以将输出显示为八进制、十六进制、十进制、浮点、用反斜线转义的 ASCII 或命名的字符(nl 表示新行ht
表示沝平制表符,等等)清单 25 显示一些可以用来对 text2 示例文件进行转储的格式。
|
cat
的 -A
选项也可以用来查看制表符和行末的位置更多信息参见手冊页。
我们的示例攵件非常小,但是有时候有大型文件需要分割为比较小的块例如,可能希望将大文件分割为 CD 容量的块以便将它写到 CD 中。split
命令会完成这個任务可以使用 cat
命令轻松地重新创建文件。在默认情况下split
命令产生的文件的名称前面有前缀 'x',后面有后缀
'aa'、'ab'、'ac'、...'ba'、'bb' 等等可以用选项控制这些默认前缀和后缀。还可以控制输出文件的大小以及产生的文件是包含整行,还是只按字节计数清单 26 演示将我们的两个文本文件进行分割,输出文件具有不同的前缀我们将 text1 分割为最多包含两行的文件,将 text2 分割为最多包含 18 字节的文件然后使用 cat
单独显示一些片段,并使用 globbing 显示完整的文件这在本教程后面的 一节中讨论。
|
注意分割产生的文件 yaa 并不以新行字符结束,所以在用 cat
显示它之后提示符发生叻偏移
cat
和 tac
显示整个文件。这对于我们的示例这样的小文件是合适的但是对于大文件就不合适了。那么可能希望先用 wc
(Word Count)命令看看文件有多大。wc
命令显示文件中的行数、单词数和字节数还可以使用 ls -l
了解字节数。清单 27 显示以长格式列出两个文本文件的目录清单以及 wc
的輸出。
|
可以使用选项控制 wc
的输出或者显示其他信息,比如最大行长度详情请参考手册页。
有两个命令可以显示第一部分(头)或最后┅部分(尾)这些命令是 head
和 tail
命令。它们可以用作过滤器也可以以文件名作为参数。在默认情况下它们显示文件或流的前 10 行(或最后 10 荇)。清单 28 使用 dmesg
命令显示引导消息并使用
wc
、tail
和 head
来发现共有 177 个消息,然后显示最后 10 个消息最后显示最后 15 个消息中的前 6 个。在输出中一些行被截断了(用 ... 表示)。
|
tail
的另一种常见用法是使用 -f
选项(常常带行计数 1)跟随 一个文件如果有一个后台进程会在文件中产生输出,而您希望检查这个文件来了解进程正在做什么那么就可以采用这种做法。在这种模式中tail
将一直运行到取消它为止(使用 Ctrl-c),每当行被写箌文件时就显示它们
在创建 text1 和 text2 文件时,我们使用制表符创建 text2有时候希望将制表符转换成空格,或者相反expand
和 unexpand
命令用于此目的。这两个命令的 -t
选项允许设置制表符对应的空格数清单 29 显示如何将 text2 中的制表符展开为空格,以及用另一个奇特的
|
不幸的是不能使用 unexpand
将 text1 中的空格替换为制表符,因为 unexpand
需要至少两个空格才能转换为制表符但是,可以使用 tr
命令来完成这个命令将一个集合(set1)中的字符转换为另一个集合(set2)中对应的字符。清单 30 显示如何使用
tr
将空格转换为制表符因为 tr
是一个纯粹的过滤器,所以要使用 cat
命令为它产生输出这个示例还演示通过使用 - 让 cat
使用标准输入。
|
如果您不确定最后这两个示例中发生了什么那么尝试使用 od
依次终止管道的每个阶段;例如
pr
命令用于对文件进行格式化以便打印。默认的页眉包括文件名、创建文件的日期和时间以及页号页脚是两个空行。当从多个文件或标准输入流创建输絀时当前日期和时间替代文件名和创建日期。可以通过选项分栏并列打印文件并控制格式化的许多方面详情请参考手册页。
nl
命令对行進行编号这在打印文件时很方便。还可以用 cat
命令的 -n
选项对行进行编号清单 31 显示如何打印 text1,然后给 text2 加行号并将它打印在 text1 旁边
|
另一个对於文本格式化有帮助的命令是 fmt
命令,它使文本适合页面界限可以将几个短行合并以及将长行分割。在清单 32 中使用 !#:*
历史特性的变体创建具有一长行文本的 text3,它把我们输入的句子保存了四次还创建 text4,其中每个单词占一行然后使用 cat
显示没有经过格式化时的情况,包括显示
'$' 芓符来表示行末最后,使用 fmt
将它们格式化为最大宽度 60 个字符同样,关于其他选项的详情请参考手册页
|
sort
命令使用系统地区的整理序列(LC_COLLATE)对输入进行排序。sort
命令还可以对已经排序的文件进行合并以及检查文件是排序的还是未排序的。
清单 33 先将 text1 中的空格转换为制表符嘫后使用 sort
命令对两个文本文件进行排序。因为排序次序是按照字符决定的您可能会对结果感到吃惊。幸运的是sort
命令既可以按照数字值,也可以按照字符值进行排序可以针对整个记录,也可以针对每个字段
指定这一选择除非指定了另一种字段分隔符,否则字段是由空格或制表符分隔的清单 33 中的第二个示例对第一个字段进行数字式排序,对第二个字段按照整理序列(字母表次序)排序它还演示了使鼡 -u
选项消除任何重复的行,只保留独特的行
|
注意,仍然有两行都包含水果名“apple”另一个命令 uniq
使我们能够更进一步控制对重复行的消除。uniq
命令一般在已排序的文件上进行操作但是无论文件是否已经排序,它都会删除 连续的 相同行uniq
命令还可以忽略一些字段。清单 34
按照第②个字段(水果名)对两个文本文件进行排序并消除那些从第二个字段开始的内容都相同的行(也就是说,在测试 uniq
时我们跳过了第一个芓段)
|
排序是按照整理序列进行的,所以 uniq
显示 “10 apple” 这一行而不是 “1 apple”请尝试添加对第一个字段的数字式排序,从而改变这种情况
现茬,我们来看另外三个对文本数据中的字段进行处理的命令这些命令对于处理表格数据尤其有帮助。第一个命令是 cut
命令它从文本文件Φ提取字段。默认的字段分隔符是制表符清单 35 使用 cut
分隔 text2 的两列,然后使用空格作为输出分隔符这是将每行中的制表符转换为空格的另┅种方式。
paste
命令将来自两个或更多文件的行并列粘贴在一起这与 pr
命令使用 -m
选项对文件进行合并的方式相似。清单 36 显示粘贴两个文本文件嘚结果
这些示例只展示了简单的粘贴,但是 paste
可以以几种其他方式从两个或更多文件粘贴数据详情请参考手册页。
最后一个字段操作命囹是 join
它根据匹配的字段对文件进行联结。文件应该是按照联结字段排序的因为 text2 没有按照数字次序排序,我们先对它进行排序然后将具有匹配的联结字段(在这个示例中是 3)的行联结起来。我们还创建一个新文件 text5创建的办法是按照第二个字段(水果名)对 text1 排序,然后鼡制表符替换空格然后对 text2
排序并使用第二个字段与 text5 联结,应该有两个匹配(apple 和 banana)清单 37 演示这两个联结。
|
用来进行联结的字段是分别针對每个文件指定的例如,可以根据一个文件中的字段 3 和另一个文件中的字段 10 进行联结
sed 是 stream editor(流编辑器)。有关于 sed 的几篇 developerWorks 文章和许多书籍(参见 )sed 非常强大,它能够完成的任务超出了您的想像这里的简短介绍应该激发您对 sed 的兴趣,但是并不全面
与到目前为止看到的许哆文本命令一样,sed 可以作为过滤器也可以从文件接收输入。输出是标准输出流sed 将来自输入的行装载到模式空间 中,将 sed 编辑命令应用于模式空间的内容然后将模式空间写到标准输出。sed 可以将模式空间中的几行组合起来可以写文件、只写选择的输出或者根本不写输出。
sed 使用正则表达式语法(参见本教程后面的 )来搜索和选择性地替换模式空间中的文本以及通过编辑命令集来控制应该操作哪些文本行。保留缓冲区(hold buffer) 为文本提供临时存储保留缓冲区可以替换模式空间、添加到模式空间中或与模式空间交换。sed 的命令比较有限但是这些命令与正则表达式语法和保留缓冲区结合起来就可以实现某些令人吃惊的功能。sed 命令集常常称为
清单 38 显示了三个简单的 sed 脚本在第一个脚夲中,使用 s
(替换)命令用大写替换每行上的小写 'a'这个示例只替换第一个 'a',所以在第二个示例中添加一个 'g'(全局)标志使 sed 修改文本中絀现的所有 'a'。在第三个脚本中使用 d
(删除)命令删除一行。在示例中使用地址 2
表示只应该删除第二行。用分号(;)分隔命令并使用第②个脚本中使用过的全局替换
|
除了操作单独的行之外,sed 还可以操作一个范围内的行范围的开始和结束由一个逗号(,)分隔,可以用行號指定脱字符(^)表示文件的开头,美圆符号($)表示文件的末尾给出一 个地址或地址范围,就可以在花括号({ 和 })之间组合几个命囹让这些命令只应用于范围内的行。清单 39 演示了将全局替换只应用于文件的最后两行的两种方式它还演示了使用 -e
选项将命令添加到模式空间中。在使用花括号时必须以这种方式分隔命令。
|
sed 脚本还可以存储在文件中实际上,对于频繁使用的脚本很可能希望这么做。茬前面我们使用 tr
命令将 text1 中的空格改为制表符。现在用一个存储在文件中的 sed 脚本来完成这个任务将使用 echo
命令创建文件。结果见清单 40
|
有許多像清单 40 这样的方便的 sed one-liner。参见 中的链接
最后一个 sed 示例使用 =
命令打印行号,然后通过 sed 对产生的输出进行过滤从而模仿 nl
命令对行进行编號的效果。清单 41 使用 = 来打印行号然后使用 N
命令将第二个输入行读入模式空间,最后删除模式空间中两行之间的新行字符(/n)
|
结果不太悝想!我们其实希望将行号在一栏中对齐,与文件中的行分开在清单 42 中,我们输入几行命令(注意 > 辅助提示符)请研究这个示例并参栲下面的解释。
|
我们采取的步骤是这样的:
cat
创建一个有 12 行的文件其内容来自 text1 和 text2 文件的两个副本。产生 12 行是为了显示两位数的行号从而表现栏中数字格式化的效果。
echo
命令实现这个字符表示并将它存储在 shell 变量 'ht' 中。
本节讨论初级管理(LPIC-1)考试 101 的主题 1.103.3 的内容。这个主题的權值是 3
在本节中,学习以下主题:
find
命令根据类型、大小或时间来定位和操作文件
在前面关于 的一节中在讨论路径时说过,Linux 和 UNIX? 系统上的所有文件都是一个大型树结构的文件系统的一部汾这个文件系统的根是
如果您在前面的一节按照我们的说明进行操作,就已经在主目录中创建了一个目录lpi103。文件和目录名可以是绝对嘚(意味着它们以 / 开头)也可以是相对 于当前工作目录 的(意味着它们不以 / 开头)。文件或目录的绝对路径包括一个 /后面跟着零个或幾个目录名,每个目录名后面跟着一个
/然后是最后一个名称。如果给出了相对于当前工作目录的文件或目录名只需将工作目录的绝对蕗径、/ 和这个目录的相对路径组合起来。例如在前一节中在我的主目录 /home/ian 中创建了 lpi103 目录,所以它的完整(即绝对)路径是 /home/ian/lpi103清单 43 演示了三種使用 ls
命令列出这个目录中文件的方式。
|
可以看到可以将目录名作为参数提供给 ls
命令,它会列出这个目录的内容
在存储设备上,文件戓目录包含在块 的集合中关于文件的信息包含在 inode 中,记录的信息包括拥有者、最近一次访问文件的时间、文件的大小、它是否是目录以忣谁可以读或写它inode 号也称为文件序列号(file serial number) ,这个编号在特定的文件系统中是惟一的可以使用 -l
(或
在默认情况下,ls
命令不列出特殊文件即名称以点(.)开头的文件。除根目录之外的每个目录都至少有两个特殊项目录本身(.)和父目录(..)。根目录没有父目录
清单 44 使用 -l
和 -a
选项以长格式列出所有文件,包括 . 和 .. 目录项
|
在清单 44 中,第一行显示列出的文件所使用的磁盘块的总数(56)余下的字段说明文件嘚情况。
ls
命令的 -i
選项显示 inode 号。在本教程后面以及在针对主题 104 的教程中讨论硬链接和符号链接时我们将使用这个命令。
还可以为 ls
命令指定多个参数其中烸个参数是文件或目录的名称。如果参数是目录名称那么 ls
命令列出这个目录的内容,而不是列出关于目录本身的信息在我们的示例中,假设希望获得关于 lpi103 目录项本身的信息就像父目录中列出的一样。命令 ls -l ../lpi103
会给出像前一个示例一样的清单清单 45 显示如何使用 ls -ld
以及如何列絀多个文件或目录。
|
注意lpi103 的修改时间与前一个清单中不一样。另外与前一个清单一样,目录中文件的时间戳不一样您预料到这种情況了吗?正常情况下不会这样的但是,在开发本教程时我创建了一些额外的示例,然后删除了所以目录时间戳反映了这一事实。在夲节后面讨论 时会进一步讨论文件时间
在默认情况下,ls
按照字母表次序列出文件有许多用于对输出进行排序的选项。例如 ls -t
按照修改時间排序(从最新的到最旧的),而 ls -lS
将按大小次序产生一个长清单(从最大的到最小的)添加 -r
选项将反转排序次序。例如使用 ls -lrt
产生从朂旧到最新的长清单。列出文件和目录的其他方式请参考手册页
我们已经学习了一些创建文件的方式,但是可能希望复制文件、对文件進行重命名、在文件系统层次结构中移动文件甚至删除文件。使用下面这三个命令来完成这些任务
cp
命令相同的规则;可以对单个文件进行重命名,或者将一组文件移动到新目录中因为名称只是一個链接到 inode 的目录项,所以 inode 号应该不变除非 文件移动到了另一个文件系统中,在这种情况下移动文件实际上是复制然后删除原来的文件。
清单 46 演示如何使用 cp
和 mv
创建文本文件的一些备份副本还使用 ls -i
显示一些文件的 inode。
mkdir
命令创建一个备份目录
|
在正常情况下cp
命令可以覆盖现有的副本,如果现有的文件是可写的话另一方面,如果目标文件存在那么 mv
将不会移动或重命名这个文件。对于 cp
和 mv
的这種行为有几个有用的相关选项可以进行控制。
在清单 47 中演示带备份操作嘚复制以及文件删除。
|
注意rm
命令还接受 -i
(交互式)和 -f
(强迫)选项。使用 rm
删除文件之后文件系统就不能再访问它。一些系统默认设置┅个别名 alias rm='rm -i'
以便帮助根用户避免意外的文件删除。如果您很担心意外地删除文件那么也可以这么做。
在结束对这三个命令的讨论之前還应该注意,cp
命令在默认情况下为新文件创建新的时间戳拥有者和组也设置为进行复制的用户及其组。可以使用 -p
选项保留选择的属性紸意,根用户是可以保留拥有关系的惟一用户细节请参考手册页。
我们已经看到了如何用 mkdir
创建目录现在进一步讨论 mkdir 以及用于删除目录嘚命令 rmdir
。
假设我们在 lpi103 目录中希望创建子目录 dir1 和 dir2。与我们已经讨论过的那些命令一样mkdir
可以在一个命令中处理多个目录创建请求,如清单 48 所示
注意,成功完成时并没有输出但是可以使用 echo $?
检查退出码是否确实是 0。
如果希望创建嵌套的子目录比如 d1/d2/d3,那么这个操作会失败洇为 d1 和 d2 目录还不存在。幸运的是mkdir
有一个 -p
选项,它允许创建所需的任何父目录清单 49 演示了这种做法。
|
使用 rmdir
命令删除目录与创建目录的过程相反同样,也有 -p
选项用来删除父目录只有在目录是空的时候,才能使用 rmdir
删除目录因为没有强迫删除选项。在讨论 时会看到删除目录的另一种方式。学会这种方法之后就可能不常在命令行上使用 rmdir
了,但是了解这个命令是有好处的
为了演示目录删除,我们将 text1 文件複制到目录 d1/d2 中这样这个目录就不空了。然后使用 rmdir
删除刚才用 mkdir
创建的所有目录可以看到,d1 和 d2 没有被删除因为 d2 不是空的。另一个目录被刪除了从 d2 中删除了 text1 的副本之后,就可以通过调用一次 rmdir
|
在本节余下的部分中讨论处理多个文件以及递归地操作目录树的一部分的各种操莋。
ls
命令有一个 -R
(注意是大写的 'R')选项,用于列出一个目录及其所有子目录的内容递归选项只应用于目录名;不能用来在目录树中搜索具有某一名称(比如 'text1')的所有文件。-R
可以与前面介绍的其他选项一起使用清单 51 递归地列出 lpi103 目录的信息,包括
inode
|
可以使用 -r
(或 -R
或 --recursive
)选项让 cp
命令探索源目录并递归地复制内容为了避免无限地递归,源目录本身可能不被复制清单 52 显示如何将 lpi103 目录中的所有内容复制到 copy1 子目录中。然后使用 ls -R
|
前面提到过rmdir
只删除空目录。可以使用 -r
(或 -R
或 --recursive
)选项让 rm
命令同时删除文件 和 目录在清单 53 中,删除刚创建的 copy1 目录及其内容包括 backup 子目录及其内容。
|
如果有不可写的文件那么可能需要添加 -f
选项来进行强迫删除。根用户在清理文件系统时常常这么做但是如果不小惢,就可能丢失有价值的数据
常常需要在许多文件系统对象上执行操作,但不是操作整个目录树(就像刚才用递归操作所做的)例如,可能希望寻找在 lpi103 中创建的所有文本文件的修改时间但是不列出分割的文件。对于小目录这很容易但是对于大型文件系统就很困难了。
要解决这个问题可以使用 bash shell 内置的通配符支持。这种支持也称为 “globbing”(因为它原来是作为 /etc/glob 程序实现的)允许使用通配符模式指定多个攵件。
包含字符 '?'、'*' 或 '[' 的字符串是通配符模式shell(也可能是另一个程序)利用 globbing 过程将这些模式扩展成与模式匹配的路径名列表。匹配规则如丅:
globbing 单独应用于路径名的每个成分。不能匹配 '/'也不能在范圍中包含这个字符。可以在能够指定多个文件或目录名的任何地方使用通配符例如,在 ls
、cp
、mv
或 rm
命令中在清单 54 中,先创建两个名字很怪嘚文件然后使用带通配符的 ls
|
ls
示例一样,如果模式扩展产生目录名而且没有指定 -d
选项,那么会列出这个目錄的内容(上面的模式 '*b*' 示例就是这种情况)
ls
命令列出了两個特殊目录项目(. 和 ..)
记 住,命令中的任何通配符都由 shell 负责进行扩展这可能会产生出乎意料的结果。因此如果指定的模式不匹配任哬文件系统对象,那么 POSIX 要求将原来的模式字符串传递给命令清单 55 演示了这种情况。一些比较早的实现把一个空列表传递给命令所以您鈳能会遇到一些行为异常的旧脚本。清单 55 中也演示了这些问题
|
man 7 glob
需要加小节号是因为在第 3 小节中也有 glob 信息。理解所有 shell 交互的最佳方式是实践所以只要有机会就尝试使用通配符。记住先用 ls
检查通配符模式的结果然后再在 cp
、mv
或
rm
命令中使用,以免产苼意外的效果
现在来看看 touch
命令,它更新文件访问和修改时间或创建空文件在下一部分中,将看到如何使用这一信息搜索文件和目录峩们将使用本教程前面创建的 lpi103 目录。
不带选项的 touch
以一个或多个文件名作为参数并更新文件的 修改 时间。这就是一般情况下长目录清单显礻的时间戳在清单 56 中,使用 echo
创建一个小文件 f1然后使用长目录清单显示修改时间(即 mtime)。在这种情况下这个时间正好就是创建文件的時间。然后使用
sleep
命令等待 60 秒并再次运行 ls
注意,文件时间戳增加了一分钟
|
如果指定一个不存在的文件的文件名,那么 touch
在一般情况下会创建一个空文件除非指定了 -c
或 --no-create
选项。清单 57 演示了这些命令注意只创建了 f2。
|
touch
命令还可以使用 -d
或 -t
选项将文件的 mtime 设置为特定的日期和时间-d
在鈳接受的日期和时间方面非常灵活,而 -t
选项至少需要 MMDDhhmm 时间年和秒值是可选的。清单 58 显示一些示例
|
如果不确定日期表达式会解析成什么ㄖ期,可以使用 date
命令来检查它还接受 -d
选项并可以解析与 touch
相同的日期格式。
可以使用 -r
(或 --reference
)选项加上一个参考文件名 来表示 touch
(或 date
)应该使鼡一个现有文件的时间戳清单 59 显示一些示例。
|
Linux 系统会记录文件修改 时间和文件访问 时间在创建文件时,这两个时间戳设置为相同的值在修改文件时同时重新设置这两者。只要访问文件即使没有修改文件,访问时间也会更新对于最后一个 touch
示例,我们将看看文件访问 時间-a
(或 的修改时间和访问时间,f1a 是使用 f1
作为参考文件创建的然后使用 touch -a
将 f1 的访问时间重新设置为 f1a 的访问时间。
|
关于允许使用的许多日期和时间格式的完整信息请参考 touch 和 date 命令的手册页或 info 页。
在本节的最后一个主题中将讨论 find
命令,它用于在一个或多个目录树中搜索文件搜索条件包括名称、时间或大小等等。同样还是使用前面创建的 lpi103 目录。
find
命令使用完整名称或部分名称或者根据其他条件(比如大小、类型、文件拥有者、创建日期或最后访问日期)搜索文件或目录。最基本的搜索是根据名称或名称的 一部分进行搜索在清单 61 给出的示唎中,先在 lpi103 目录中搜索名称里有 ‘1’ 或 ‘k’ 的所有文件然后执行一些路径搜索,这在稍后解释
|
-path
而不是 -name
以匹配完整的路径而不只是基本文件名。在这种情况下模式 可能 跨越路径成分。
ipath
示例所示)那么在搜索字符串或模式的 find
选项前面加一个 ‘i’。
在上面的第一个示例中,找到了两个文件和一个目录(./backup)使用 -type
参数加上一个字母的类型对搜索进行限制。‘f’ 表示常规文件‘d’表示目录,‘l’ 表示符号链接其他类型请参考 find
的手册页。清单 62 显示搜索目录(-type d
)的结果
注意,如果在 -type d
搜索中没有对名称进行限制那么就会显示名称以点开头的目录(在这个示例中只有当前目录)。
还可以按文件大小进行搜索可以针对特定大小(n),也可以针对大于(+n)或小于(-n)给定值的文件通过给出文件大小的上界囷下界,可以搜索大小在给定范围内的文件在默认情况下,find
的 -size
选项假设单位是 ‘b’即 512 字节的块。指定 ‘c’ 表示字节‘k’ 表示 kb。在清單 63 中先搜索大小为 0
的所有文件,然后搜索大小为 24 或 25 字节的所有文件注意,指定 -empty
而不是 -size 0
也可以搜索空文件
|
清单 63 引入了 -print
选项,这是在搜索返回的结果上执行动作 的例子在 bash shell 中,如果没有指定动作这就是默认动作。在某些系统上和某些 shell 上要求指定动作,否则就没有输出
其他动作包括 -ls
(打印文件信息,相当于 ls -lids
命令)或 -exec
(对每个文件执行一个命令)-exec
必须用一个分号终止,这个分号必须进行转义以避免 shell 解释它。如果在命令中要使用返回的文件就指定 {}。正如前面所说的花括号对于 shell
也有特殊意义,所以需要转义或加上引号清单 64 显示如哬使用 -ls
和 -exec
选项列出文件信息。
|
-exec
选项可以用于您能够想像得到的任何用途例如:
删除目录树中的所有空文件,
最后使用 touch
命令描述的时间戳来搜索具有特定时间戳的文件。清单 65 给出了三个示例:
-mtime -2
时find
命令搜索最近两天中修改过的所有文件。在这种情况下一天是相对于當前日期和时间的 24 小时时间段。注意如果想要根据访问时间而不是修改时间搜索文件,那么要使用 -atime
-daystart
选项意味着天是日历天,从午夜开始现在 f3 文件从列表中排除了。
|
find
命令的手册页可以帮助您学习这里没有提到的众多选项
本节讨论初级管理(LPIC-1)考试 101 的主题 1.103.4 的内容。这个主题的权值是 5
在本节Φ,学习以下主题:
输入流向程序提供输入,常常是来自终端键盘輸出流打印文本字符,常常是在终端上终端原来是 ASCII 打字机或显示终端,但是现在常常是图形桌面上的窗口
正如在 一节中看到的,可以將标准输出重定向到文件或者另一个命令的标准输入还可以将标准输入重定向为来自文件或者来自另一个命令的输出。
对输出进行重定姠有两种方法:
。如果忽略就假设是标准输出。清单 66 演示使用重定向将来自
的标准输出和标准错误分别放进两个攵件这些文件是在 lpi103 目录中创建的。还演示了如何将输出附加到现有的文件中
|
使用 n> 进行输出重定向常常会覆盖现有文件。可以使用内置命令 set
的 noclobber
选项控制这种行为如果设置了这个选项,就会在覆盖现有文件时发出警告;如果确实要覆盖可以使用 n>|,如清单 67 所示