第5章
Ubuntu文件管理



本章学习目标: 
 了解文件系统的含义。
 掌握Ubuntu文件系统的结构。
 掌握Ubuntu文件系统的管理方法。
 掌握文件管理的命令。

文件和目录管理是Linux系统运行维护的基础工作,在Linux系统下用户的数据和程序都是以文件的形式保存的,所以在使用Linux的过程中,经常要对文件和目录进行操作。




5.1文件系统概述
文件系统是操作系统最重要的组成部分之一,操作系统之所以能够找到磁盘上的文件,是因为有磁盘上的文件名与存储位置的记录。文件系统是解决如何在存储设备上存储数据的一套方法,包括存储布局、文件命名、空间管理、安全控制等,用于对磁盘进行存储管理及输入输出。Linux操作系统支持很多现代的流行文件系统,其中,
Ext2、Ext3和Ext4最普遍。Ext2文件系统是伴随着Linux一起发展起来的,在Ext2的基础上增加日志就是Ext3,Ext4是第4代扩展文件系统,是Linux系统下的日志文件系统,是Ext3文件系统的后继版本。
2008年12月25日,Linux Kernel 2.6.28的正式版本发布。随着这一新内核的发布,Ext4文件系统也结束实验期,成为稳定版。
Ext4在功能上与Ext3非常相似,但支持大文件系统,提高了对碎片的抵抗力,有更高的性能以及更好的时间戳。
目前的大部分Linux文件系统都默认采用Ext4文件系统。
5.1.1文件系统
1. Ext2

第2代扩展文件系统(second extended filesystem,Ext2)是Linux内核所用的文件系统。它由Rémy Card设计,用以代替Ext,于1993年1月加入Linux核心支持之中。Ext2的经典实现为Linux内核中的Ext2fs文件系统驱动,最大可支持2TB的文件系统,到Linux核心2.6版时,扩展到可支持32TB。Ext2为Debian、Red Hat Linux等Linux发行版的默认文件系统。
Ext2文件系统具有以下一些特点。
(1) 当创建Ext2文件系统时,系统管理员可以根据预期的文件平均长度来选择最佳的块大小(1024~4096B)。例如,当文件的平均长度小于几千字节时,块的大小为1024B是最佳的,因为这会产生较少的内部碎片——也就是文件长度与存放块的磁盘分区有较少的不匹配。另外,大的块对于大于几千字节的文件通常比较合适,因为这样的磁盘传送较少,因而减轻了系统的开销。
(2) 当创建Ext2文件系统时,系统管理员可以根据在给定大小的分区上预计存放的文件数来选择给该分区分配多少个索引节点。这可以有效地利用磁盘的空间。
(3) 文件系统把磁盘块分为组。每组包含存放在相邻磁道上的数据块和索引节点。正是这种结构,使得可以用较少的磁盘平均寻道时间对存放在一个单独块组中的文件并行访问。
(4) 在磁盘数据块被实际使用之前,文件系统就把这些块预分配给普通文件。因此当文件的大小增加时,因为物理上相邻的几个块已被保留,就减少了文件的碎片。

(5) 支持快速符号链接。如果符号链接表示一个短路径名(小于或等于60个字符),就把它存放在索引节点中而不用通过由一个数据块进行转换。
其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 x86 计算机系统中,簇最大为 4KB, 则单一文件大小上限为 2048GB, 而文件系统的容量上限为 16384GB。

但由于目前Linux 2.4所能使用的单一分区最大只有2048GB,实际上能使用的文件系统容量最多也只有2048GB。

2. Ext3
第3代扩展文件系统(third extended filesystem,Ext3)是一个日志文件系统,常用于Linux操作系统。它是很多Linux发行版的默认文件系统。Stephen Tweedie在1999年2月的内核邮件列表中,最早显示了他使用扩展的Ext2,该文件系统从2.4.15版本的内核开始,合并到内核主线中。
Ext3日志文件系统的特点如下。
(1) 高可用性。
系统使用了Ext3文件系统后,即使在非正常关机后,系统也不需要检查文件系统。宕机发生后,恢复Ext3文件系统只要数十秒钟。

如果在文件系统尚未shutdown前就关机(如停电)时,下次重新开机后会造成文件系统的资料不一致,因此,需做文件系统的重整工作,将不一致与错误的地方修复。然而,此项重整工作是相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的资料都不会损失。

为了解决此问题,使用所谓的“日志式文件系统(Journal File System)”。此类文件系统最大的特色是会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。
在日志式文件系统中,由于详细纪录了每个细节,故当在某个过程中被中断时,系统可以根据这些记录直接回溯并重整被中断的部分,而不必花时间去检查其他的部分,故重整的工作速度相当快,几乎不需要花时间。
(2) 数据的完整性。
Ext3文件系统能够极大地提高文件系统的完整性,避免了意外宕机对文件系统的破坏。在保证数据完整性方面,
Ext3文件系统有两种模式可供选择。其中之一就是“同时保持文件系统及数据的一致性”模式。采用这种方式,
用户永远不再会看到由于非正常关机而存储在磁盘上的垃圾文件。
(3) 文件系统的速度。

尽管使用Ext3文件系统时,有时在存储数据时可能要多次写数据,但是
从总体上来看,Ext3比Ext2的性能还要好一些。这是因为Ext3的日志功能对磁盘的驱动器读写头进行了优化。所以,文件系统的读写性能较之Ext2文件系统来说并没有降低。

(4) 数据转换。

由Ext2文件系统转换成Ext3文件系统非常容易,只要简单地输入两条命令即可完成整个转换过程,用户不用花时间备份、恢复、格式化分区等。用一个Ext3文件系统提供的小工具tune2fs,
可以将Ext2文件系统轻松转换为Ext3日志文件系统。另外,Ext3文件系统可以不经任何更改,而直接加载成为Ext2文件系统。

(5) 多种日志模式。

Ext3有多种日志模式,一种工作模式是对所有的文件数据及metadata(定义文件系统中数据的数据,即
元数据)进行日志记录(data=journal模式); 另一种工作模式则是只对metadata记录日志,而不对数据进行日志记录,也即所谓
的data=ordered或者data=writeback模式。系统管理人员可以根据系统的实际工作要求,在系统的工作速度与文件数据的一致性之间做出选择。
3. Ext4
第4代扩展文件系统(fourth extended filesystem,Ext4)是Linux系统下的日志文件系统,是Ext3文件系统的后继版本。

Ext4是由Ext3的维护者Theodore Tso领导的开发团队实现的,并引入Linux 2.6.19内核中。
Ext4的产生原因是开发人员在Ext3中加入了新的高级功能,但在实现的过程出现了以下几个重要问题。
(1) 一些新功能违背向后兼容性。
(2) 新功能使Ext3代码变得更加复杂并难以维护。
(3) 新加入的更改使原来十分可靠的Ext3变得不可靠。

由于这些原因,从2006年6月开始,开发人员决定把Ext4从Ext3中分离出来进行独立开发。Ext4的开发工作从那时起开始进行,但大部分Linux用户和管理员都没有太关注这件事情,直到2.6.19内核在2006年11月发布,Ext4第一次出现在主流内核里,但是它当时还处于实验阶段,因此很多人都忽视了它。

2008年12月25日,Linux Kernel 2.6.28的正式版本发布。随着这一新内核的发布,Ext4文件系统也结束实验期,成为稳定版。


Linux Kernel自2.6.28开始正式支持新的文件系统Ext4。Ext4是Ext3的改进版,修改了Ext3中部分重要的数据结构,而不仅像
Ext3对Ext2那样,只是增加了一个日志功能而已。Ext4可以提供更佳的性能和可靠性,还有更为丰富的功能。
Ext4文件系统具有以下特点。

(1) 更大的文件系统和更大的文件。

Ext3文件系统最多只能支持32TB的文件系统和2TB的文件,根据使用的具体架构和系统设置,实际容量上限可能比这个数字还要低,即只能容纳2TB的文件系统和16GB的文件。而Ext4文件系统容量达到1EB,文件容量则达到16TB,这是一个非常大的数字。对一般的台式计算机和服务器而言,这可能并不重要,但对于大型磁盘阵列的用户而言,这就非常重要了。
(2) 更多的子目录数量。

Ext3目前只支持32000个子目录,而Ext4取消了这一限制,理论上支持无限数量的子目录。

(3) 更多的块和i节点数量。
Ext3文件系统使用32位空间记录块数量和i节点数量,而Ext4文件系统将它们扩充到64位。

(4) 多块分配。

当数据写入Ext3文件系统中时,Ext3的数据块分配器每次只能分配一个4KB的块,如果写一个100MB的文件就要调用25600次数据块分配器,而Ext4的多块分配器Multiblock Allocator(MBAlloc)支持一次调用分配多个数据块。
(5) 持久性预分配。

如果一个应用程序需要在实际使用磁盘空间之前对它进行分配,大部分文件系统都是通过向未使用的磁盘空间写入0来实现分配,比如P2P软件。为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。而Ext4在文件系统层面实现了持久预分配并提供相应的API,比应用软件自己实现更有效率。
(6) 延迟分配。

Ext3的数据块分配策略是尽快分配,而Ext4的策略是尽可能地延迟分配,直到文件在缓冲中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,显著提升性能。
(7) 盘区结构。

Ext3文件系统采用间接映射地址,当操作大文件时,效率极其低下。例如,一个100MB大小的文件,在Ext3中要建立25600个数据块(以每个数据块大小为4KB为例)的映射表; 而Ext4引入了盘区的概念,每个盘区为一组连续的数据块,上述文件可以通过盘区的方式表示为“该文件数据保存在接下来的25600个数据块中”,提高了访问效率。
(8) 新的i节点结构。
Ext4支持更大的i节点。之前的Ext3默认的i节点大小为128B,Ext4为了在i节点中容纳更多的扩展属性,默认i节点大小为256B。另外,Ext4还支持快速扩展属性和i节点保留。
(9) 日志校验功能。

日志是文件系统最常用的结构,日志也很容易损坏,而从损坏的日志中恢复数据会导致更多的数据损坏。Ext4给日志数据添加了校验功能,日志校验功能可以很方便地判断日志数据是否损坏。而且Ext4将Ext3的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。
(10) 支持“无日志”模式。
日志总归会占用一些开销。Ext4允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。
(11) 默认启用Barrier。

磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写Commit记录。若Commit记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4文件系统默认启用Barrier,只有当Barrier之前的数据全部写入磁盘,才能写Barrier之后的数据。

(12) 在线碎片整理。

尽管延迟分配、多块分配和盘区功能可以有效减少文件的碎片,但碎片还是不可避免会产生。Ext4支持在线碎片整理,并提供e4defrag工具进行个别文件或整个文件系统的碎片整理。
(13) 支持快速fsck。

以前的文件系统版本执行fsck时很慢,因为它要检查所有的i节点,而Ext4给每个块组的i节点表中都添加了一份未使用i节点的列表,所以Ext4文件系统做一致性检查时就可以跳过它们而只去检查那些在使用的i节点,从而提高了速度。
(14) 支持纳秒级时间戳。
Ext4之前的扩展文件系统的时间戳都是以秒为单位的,这已经能够应付大多数设置,但随着处理器的速度和集成程度(多核处理器)不断提升,以及Linux开始向其他应用领域发展,它将时间戳的单位提升到纳秒。
Ext4给时间范围增加了两个位,从而让时间寿命再延长500年。Ext4的时间戳支持的日期到2514年4月25日,而Ext3只到2038年1月18日。
5.1.2文件系统概念

在Linux系统中有一个重要的概念: 一切都是文件,实现了设备无关性。其实这是UNIX哲学的一
种体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问,UNIX 权限模型也是围绕文件的概念来建立的,所以对设备也就可以同样处理了。

下面来详细地了解Linux文件系统的几个要点。
1. 物理磁盘到文件系统

我们知道文件最终是保存在硬盘上的。硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。每个盘片有两面,都可记录信息。盘片被分成许多扇形的区域,每个区域叫一个扇区,每个扇区可存储128×2
N(N=0,1,2,3)字节信息。在DOS中每扇区是128×22=512字节,盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道。硬盘中,不同盘片相同半径的磁道所组成的圆柱称为柱面。磁道与柱面都表示不同半径的圆,在许多场合,磁道和柱面可以互换使用。每个磁盘有两个面,每个面都有一个磁头,人们习惯用磁头号来区分。扇区,磁道(或柱面)和磁头数构成了硬盘结构的基本参数,通过这些参数可以得到硬盘的容量,其计算公式为: 

存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
要点: 
(1) 硬盘有数个盘片,每个盘片两个面,每个面一个磁头。
(2) 盘片被划分为多个扇形区域即扇区。
(3) 同一盘片不同半径的同心圆为磁道。
(4) 不同盘片相同半径构成的圆柱面即柱面。
(5) 公式: 存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数。
(6) 信息记录可表示为: ××磁道(柱面),××磁头,××扇区。
那么这些空间又是怎么管理起来的呢?UNIX/Linux使用了一个简单的方法,如图5.1所示。


图5.1文件系统存储空间示意图


它将磁盘块分为以下三个部分。
(1) 超级块。文件系统中第一个块被称为超级块。这个块存放文件系统本身的结构信息。例如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。

(2) i点表。超级块的下一个部分就是i节点表。每个i节点就是一个对应文件/目录的结构,这个结构包含一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的一个元素一一对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。

(3) 数据区。文件系统的第3个部分是数据区。文件的内容保存在这个区域。磁盘上所有块的大小都一样。如果文件包含超过一个块的内容,则文件内容会存放在多个磁盘块中。一个较大的文件很容易分布在上千个独立的磁盘块中。
2. 存储介质
用以存储数据的物理设备称为存储介质,如硬盘、光盘、Flash盘、磁带、网络存储设备等。
3. 磁盘分区
对于容量较大的存储介质来说(通常指硬盘),在使用时需要合理地规划分区,因而牵涉到磁盘的分区。常用的Linux磁盘分区命令有fdisk、cfdisk、parted等。还有一些工具不是操作系统自带的,称为第三方工具,如PQ等。利用磁盘分区工具,可以将硬盘分割为大小不一的多个部分,以便规划和满足实际使用的需要。
4. 格式化

创建新的文件系统是一个过程,通常称为初始化或格式化,这个过程是针对存储介质进行的。一般情况下,各种操作系统都有自己的相应工具,Ubuntu下格式化分区的命令是mkfs,有时也可以借助第三方工具来完成此过程。而此过程是建立在磁盘分区的基础之上,也就是说先进行磁盘分区,再进行文件系统的创建或格式化。
5. 挂载
在使用磁盘分区前,需要挂载该分区,这相当于激活一个文件系统。
Windows将磁盘分为若干个逻辑分区,如C盘、D盘,在各个分区中挂载文件系统。这个过程是使用其内部机制完成的,用户无法探知其过程。

Linux系统中,没有磁盘的逻辑分区(即没有C盘、D盘等),任何一个种类的文件系统被创建后都需要挂载到某个特定的目录才能使用。Linux使用mount和umount命令来对文件系统进行挂载和卸载,挂载文件系统时需要明确挂载点。如图5.2所示,把U盘/dev/sdb1(系统识别)挂载到 /mnt/usb下; 图5.3中则把U盘卸载,注意,不能在当前目录卸载,应到上一级目录或者根目录卸载。



图5.2挂载U盘




图5.3卸载U盘


5.1.3文件与目录的定义

Linux操作系统中,以文件来表示所有的逻辑实体与非逻辑实体。逻辑实体指文件与目录; 非逻辑实体泛指硬盘、终端机、打印机等。一般而言,Linux文件名由字母、标点符号、数字等构成,中间不能有空格、路径名称符号“ / ”或“#
、*、%、&、{}、[]”等与Shell有关的特殊字符。

Linux文件系统中,结构上以根文件系统最为重要。
根文件系统是指开机时将root partition挂载在根目录(/),若无法挂载根目录,开机时就无法进入Linux系统中。根目录下有/etc、/dev、/boot、/home、/lib、/lost+found、/mnt、/opt、/proc、/root、/bin、/sbin、/tmp、/var、/usr等重要目录。

下面分别使用图形界面和命令终端查看各个目录,如图5.4和图5.5所示。




1. /etc
本目录下存放着许多系统所需的重要配置与管理文件,如/etc/hostname存放配置主机名字的文件,/etc/network/interfaces
存放配置修改网络接口的IP地址、子网掩码、网关的文件,/etc/resolv.conf
存放指定DNS服务器的文件等。图5.6显示了配置文件hostname和resolv.conf的内容。通常在修改/etc目录下的配置文件内容后,只需重新启动相关服务,一般不用重启系统。



图5.4图形界面下查看文件目录




图5.5Shell终端下查看文件目录




图5.6查看配置文件


2. /dev
/dev目录中存放了device file(装置文件),使用者可以经由核心存取系统中的硬设备,当使用装置文件时内核会辨识出输入输出请求,并传递到相应装置的驱动程序以便完成特定的动作。

该目录包含所有在Linux 系统中使用的外部设备,每个设备在/dev目录下均有一个相应的项目,如图5.7所示。注意Linux与
Windows/DOS不同,不是存放外部设备的驱动程序,而是一个访问这些外部设备的端口。如/dev/cdrom下存放光驱中的文件,/dev/u下存放U盘中的文件,/dev/sda1下一般存放的是第一块硬盘第一分区中的文件。


图5.7查看外部设备


目录下还有一些项目是没有的装置,这通常是在安装系统时所建立的,它不一定对应到实体的硬件装置。此外还有一些虚拟的装置,不对应到任何实体装置,例如空设备的/dev/null,任何写入该设备的请求均会被执行,但被写入的资料均会如进入空设备般消失。

3. /boot
该目录下存放与系统激活相关的文件,是系统启动时用到的程序。如图5.8所示,initrd.img、vmlinuz、System.map
均为重要文件,不可任意删除。其中,initrd.img为系统激活时最先加载的文件; vmlinuz为Kernel的镜像文件; System.map包括Kernel的功能及位置。top、ps命令读此文件来显示系统目前的信息状态。



图5.8/boot下的文件


4. /home
登录用户的主目录就放在此目录下,以用户的名称作为/home目录下各个子目录的名称。如果建立一个用户,用户名是“malimei”,那么在/home目录下就有一个对应的/home/malimei路径,当用户malimei登录时,其所在的默认目录就是/home/malimei,如图5.9所示。


图5.9查看/home下的用户目录



也可以在图形管理界面中查看用户主目录下的文档,如图5.10所示,标签页显示路径为/home,其下存放了三个用户各自的目录。双击图标user1,进入用户user1的主目录,该用户的文件都存放在其中,如图5.11所示。


图5.10图形界面下查看/home下的用户目录 




图5.11用户user1的工作目录/home/user1


说明: 创建用户的命令是 adduser和useradd,将在第6章介绍。
5. /lib
本目录存放了许多系统激活时所需要的重要的共享函数库,lib是library(库)的英文缩写。几乎所有的应用程序都会用到这个目录下的共享库。例如,文件名为library.so.version的共享函数库就放在/lib目录下,该函数库包含很多像GNU C library(C编译程序)这样的重要部分。在图5.12中,用命令ls查看了该目录下的库文件(该命令是在/lib目录下使用的)。



图5.12查看/lib下的库文件



Linux下的库分为动态库和静态库,一般情况下,.so为共享库,用于动态连接,.a为静态库,用于静态连接。
6. /usr/lib

本目录下存放一些应用程序的共享函数库,例如Netscape、X Server等。图5.13中使用ls命令查看了该目录下的文件。其中,最重要的函数库为libc或glibc(glibc 2.x便是libc 6.x版本,标准C语言函数库),几乎所有的程序都会用到libc或glibc,因为这两个程序提供了对于Linux Kernel的标准接口。还有文件名为library.a的静态函数库,也放在/user/lib下。


图5.13查看/usr/libs下的共享函数库文件


7. /mnt
这个目录在一般情况下是空的,是系统默认的挂载点,可以临时将别的文件系统挂在这个目录下,如图5.14所示。如果要挂载额外的文件系统到/mnt目录,需要在该目录下建立任一目录作为挂载目录。如新建/mnt/usb目录,作为USB移动设备的挂载点。



图5.14查看/mnt下的文件


8. /proc

本目录为一个虚拟文件系统,它不占用硬盘空间,该目录下的文件均放置于内存中。/proc会记录系统正在运行的进程、硬件状态、内存使用的多少等信息,这些信息是在内存中由系统自己产生的。每当存取/proc文件系统时,Kernel会拦截存取动作并获取相关信息再动态地产生目录与文件内容,如图5.15所示。


图5.15查看/proc下的进程文件



9. /root
/root是系统管理用户root的主目录,如果用户是以超级用户的身份登录的,这个就是超级用户的主目录,如图5.16所示。


图5.16超级用户的主目录/root


10. /bin

本目录存放一些系统启动时所需要的普通程序和系统程序,及一些经常被其他程序调用的程序,是Linux 常用的外部命令存放的目录。例如,ls、cat、cp、mkdir、rm、su、tar 等,和外部命令相对应的还有内部命令,只要Linux系统启动起来,内部命令就可以应用,如cd等,如图5.17所示。


图5.17查看/bin下的程序文件


11. /tmp
该目录存放系统启动时产生的临时文件。有时某些应用程序执行中产生的临时文件也会暂放在此目录,如图5.18所示。


图5.18查看/tmp下的临时文件


12. /var
该目录存放被系统修改过的数据。在这个目录下的重要目录有 /var/log、/var/spool、/var/run等,分别用于存放记录文件、新闻邮件、运行时信息,如图5.19所示。


图5.19查看/var下的文件


5.1.4文件的结构、类型和属性
1. 文件结构

文件结构是文件存放在磁盘等存储设备上的组织方法,主要体现在对文件和目录的组织上。目录提供了管理文件的一个方便而有效的途径。Linux使用标准的目录结构,在安装的时候,安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式,并指定了每个目录的作用和其中的文件类型。

Linux采用的是树形结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。微软的DOS和Windows也是采用
树形结构,但是在DOS和Windows中这样的树形结构的根是磁盘分区的盘符,有几个分区就有几个树形结构,它们之间的关系是并列的。但是在Linux中,无论操作系统管理几个磁盘分区,这样的目录树只有一个。从结构上讲,各个磁盘分区上的树形目录不一定是并列的,因为Linux是一个多用户系统,一个固定的目录规划有助于对系统文件和不同的用户文件进行统一管理。
Linux中对文件路径的表达有两种方法——绝对路径和相对路径。

绝对路径: 从根目录/开始的路径。比如“/home/malimei/Documents/test1,”这一路径与当前处于哪个目录没有关系,表达式是固定的。
相对路径: 以“.”或“..”开始的,“.”表示用户当前操作所处的位置,而“..”表示上级目录。比如“./Documents/test1”,与当前目录相关。
下面举例说明这两种路径,在home下存在用户malimei和用户user1,当前用户为malimei,即当前目录为/home/malimei。现有malimei/Documents下的test1文件和user1/Documents下的test2文件,使用cat命令查看这两个文件时,可分别使用这两种不同的路径方式。如图5.20所示使用的是绝对路径方式,如图5.21所示使用的是相对路径的方式。
说明: 请比较一下,对于这个例子用哪种路径的方法显示文件比较好?为什么?



图5.20用绝对路径的方法显示文件test1和test2




图5.21用相对路径的方法显示文件test1和test2


2. 文件类型
在Linux系统中主要根据文件头信息来判断文件类型,Linux系统的文件类型有以下几种。
(1) 普通文件。

普通文件就是用户通常访问的文件,由ls l命令显示出来的属性中,第一个属性为“”。
可以使用ls l来查看文件属性,如图5.22所示,显示了/bin下的各个文件,其中的第一个“bash”就是一个普通文件,其属性(左侧第一列)的第一位是“”。


图5.22查看普通文件


(2) 纯文本文件。

普通文件中,有些文件内容可以直接读取,如文本文件,文件的内容一般是字母、数字以及一些符号等。可以使用cat、vi命令直接查看文件内容,如图5.23所示。有些文件是为系统准备的,如二进制文件,可执行的文件就是这种格式,如命令cat就是二进制文件。还有些文件是为运行中的程序准备的,如数据格式的文件,Linux用户在登录系统时,会将登录数据记录在/var/log/wtmp文件内,这个文件就是数据文件。


图5.23用cat查看纯文本文件内容


(3) 目录文件。
目录文件就是目录,相当于Windows中的文件夹。
可以使用ls l命令显示文件的属性,其中第一个属性为d的是目录文件,如图5.24所示,根目录下的bin、boot、dev等都是目录。


图5.24查看目录文件



(4) 链接文件。
在Linux中有两种链接方式: 符号链接和硬链接。符号链接相当于Windows中的快捷方式。可用ls l命令查看文件属性,符号链接文件的第一个属性用l表示,只有符号链接才会显示属性l。如图5.25所示,bzcmp就是一个链接文件,其指向bzdiff(
5.5节将详细介绍链接文件)。


图5.25查看链接文件


(5) 设备文件。


图5.26查看各分区对应的设备文件


设备文件是Linux系统中最特殊的文件。Linux系统为外部设备提供一种标准接口,将外部设备视为一种特殊的文件,即设备文件。它能够在系统设备初始化时动态地在/dev目录下创建好各种设备的文件节点,如图5.26所示,在设备卸载后自动删除/dev下对应的文件节点。在编写设备驱动的时候,不必再为设备指定主设备号,在设备注册时用0来动态获取可用的主设备号,然后在驱动中来实现创建和销毁设备文件。

在Linux系统中设备文件分为字符设备文件和块设备文件。字符设备文件是指设备发送和接收数据以字符的形式进行; 而块设备文件则以整个数据缓冲区的形式进行。由ls l/dev命令显示出来的属性中,字符设备文件的第一个属性是c,块设备文件的第一个属性是b。在图5.27中,第一行的agpgart是字符设备文件,而倒数第二行的fd0是块设备文件。


图5.27查看设备文件


执行ls l /dev/ | grep "^c",这条命令的意思就是在/dev目录下查找以c开头的文件,这里以c开头的文件就是字符设备文件,如图5.28所示。


图5.28查找以c开头的字符设备文件


(6) 套接字文件。
套接字文件通常用于网络数据连接。由ls l命令显示出来的属性中,套接字文件的第一个属性用s表示,
如图5.29所示的acpid.socket文件。


图5.29查看套接字文件



(7) 管道文件。
主要用来解决多个程序同时访问一个文件所造成的错误。由ls l命令显示出来的属性中,管道文件的第一个属性用p表示,管道一般的权限是: 所属者有读写权限,而所属组与其他用户都只有读的权限,管道文件一般都是存放在/dev目录下面,可以执行下面的命令去查看一下它的属性位: ls l /dev/|grep "^p"。这条命令的意思就是: 列出/dev/目录下的文件的详细信息,然后查找以p开头的文件,这里的p就是管道文件类型,如图5.30所示。


图5.30管道文件


3. 文件属性

对于Linux系统的文件来说,其基本的属性有三种: 读(r/4)、写(w/2)、执行(x/1)。不同用户对于文件拥有不同的读、写和执行权限。
(1) 读权限: 具有读取目录结构的权限,可以查看和阅读文件,禁止对其做任何的更改操作,用r或4表示。
(2) 写权限: 可以新建、删除、重命名、移动目录或文件(不过写权限受父目录权限控制),用w或2表示。
(3) 执行权限: 文件拥有执行权限,才可以运行,比如二进制文件和脚本文件。有执行权限才可以进入目录文件,用x或1表示。
文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。

5.2文件操作命令
5.2.1显示文件内容
1. cat





功能描述: 用来串接文件或显示文件的内容,也可以从标准输入设备读取数据并将其结果重定向到一个新的文件中,达到建立新文件的目的。
语法: cat [选项] [文件名]
选项: cat命令中的常用选项如表5.1所示。


表5.1cat命令中的常用选项



选项作用

n或 number由1开始对所有输出的行数编号
b和n相似,只不过对于空白行不编号
s当遇到有连续两行以上的空白行时,就代换为一行空白行
Eshowends,在每行结束处显示$

1) 显示文件内容到屏幕
例5.1查看文件/etc/network/interfaces的内容,带行号,如图5.31所示。

$cd/etc更改当前目录为/etc。

$cdnetwork更改当前目录为/etc/network。

$ls查看/etc/network下的文件。

$cat-ninterfaces查看该目录下文件interfaces的内容。



图5.31查看文件内容


2) 显示文件内容到文件
cat命令可以用于输出重定向,可以将现有文件的内容重定向到已有文件,如果目标文件不存在,则建立新文件。
格式一: cat a1.txt a2.txt>a3.txt
其中,“>”表示输出重定向,将a1和a2的内容输出到a3。如果a3.txt不存在,就新建一个a3文件。
格式二: cat a1.txt a2.txt>>a3.txt
其中,“>>”表示追加重定向,将a1和a2的内容添加到a3的尾部,如果a3不存在,就新建一个a3文件。
3) 串接输入内容到文件
cat命令也可以从标准输入设备读取数据到已有文件或新建文件。
格式一: cat>a.txt
格式二: cat->a.txt

从标准输入设备输入内容到文件a.txt,如果a.txt不存在则新建一个a.txt文件。从屏幕输入时,用
按Ctrl+D组合键退出输入。
例5.2查看文件内容,并将内容复制到其他文件。

$cattest1 查看test1的内容。

$cattest1>test2将test1内容重定向到test2(test2原来为空文本)。

$cattest1>>test2将test1内容重定向到test2的尾部,如图5.32所示。

$cattest1test2 >> test3将test1和test2合并到新文件test3,如图5.33所示。

$cat$cat->>test3从键盘输入内容到test3(按Ctrl+D组合键退出输入),如图5.34所示。



图5.32将test1内容复制到test2(或尾部)




图5.33将test1和test2内容合并复制到test3




图5.34从键盘输入内容到test3


例5.3创建文件并为文件输入内容,遇到结束标志EOF退出编辑,如图5.35所示。

$ cat >textfile << EOF创建textfile 文件
。

> This is a text file.输入内容。

> I like it.输入内容。

> EOF退出编辑状态。



图5.35从键盘输入到新文件


例5.4向已存在文件追加内容,遇到结束标志EOF退出编辑,如图5.36所示。

$ cat >> textfile << EOF向textfile文件追加内容。

>really?所追加的内容。

>yes!所追加的内容。

> EOF退出编辑。



图5.36从键盘输入到已有文件



例5.5连接多个文件内容并且输出到一个文件中,如图5.37所示。

$cat text1 text2 text3 > text0将text1、text2、text3文件内容放入text0文件。



图5.37复制多个文件内容到text0



在该例中,如果输出到的文件已存在则会将文件中原有内容先清空。

例5.6将一个或多个已存在的文件内容追加到一个已存在的文件中,不影响原文件内容,如图5.38所示。

$cat text1 text2 text3 >> text4将text1、text2、text3文件追加到text4文件中。



图5.38复制多个文件内容到text4尾部


2. more
功能描述: 显示输出的内容,然后根据窗口的大小进行分页显示,在终端底部打印出“More”及已显示文本占全部文本的百分比。
语法: more[选项][文件名]
选项:  more命令的常用选项如表5.2所示。


表5.2more命令的常用选项



选项作用

f或<空格>显示下一页
<回车>显示下一行
q或Q退出more
+num从第num行开始显示
num定义屏幕大小为num行
+/pattern从pattern前两行开始显示
c从顶部清屏然后开始显示
d提示按空格键继续,按Q键退出,禁止响铃功能
l忽略换页(Ctrl+l)字符
p通过清除窗口而不是滚屏来对文件进行换页
s把连续的多个空行显示为一行
u把文件内容中的下画线去掉

例5.7查看文件内容,如图5.39所示。

$moreisolat1.ent分页显示文件isolat1.ent的内容。



图5.39使用more命令查看文件内容



当文件较大时,文本内容会在屏幕上快速显示,more命令解决了这个问题,一次只显示一屏的文本。输入命令后显示的是文本内容的第一页,按Enter键显示下一行,按f键或空格键显示下一页,按
Ctrl+B组合键返回上一屏,按q键退出显示。
例5.8带选项查看文件内容,如图5.40所示。

$more +5test3从文件的第5行开始显示。

$more -4test3每屏只显示4行。

$more +/2test3从文件中的第一个“2”的前两行开始显示。

$more -dctest3显示提示,并从终端或控制台顶部显示。



图5.40查看文件内容


3. less
功能描述: 显示输出的内容,然后根据窗口的大小进行分页显示。
语法: less[选项][文件名]
选项:  less命令的常用选项如表5.3所示。


表5.3less命令的常用选项



选项作用

m显示读取文件的百分比
M显示读取文件的百分比、行号及总行数
N在每行前输出行号
s把连续多个空白行作为一个空白行显示
c从上到下刷新屏幕,并显示文件内容
f强制打开文件,禁止文件显示时不提示警告
i搜索时忽略大小写,除非搜索串中包含大写字母
I搜索时忽略大小写,除非搜索串中包含小写字母
p搜索pattern

例5.9查看文件内容,如图5.41所示。

 $ less-NEnglish显示文件English的内容时显示行号。



图5.41使用less命令查看文件内容


在Ubuntu中还有一些类似的命令,如head、tail。
4. head
功能描述: 显示文件的前n行/段,不带选项时,默认显示文件的前10行。
语法: head[选项][文件名]
选项: head命令的常用选项如表5.4所示。


表5.4head命令的常用选项



选项作用

n显示文件的前n行,系统默认值是10
c显示文件的前n个字节

例5.10按照行/段查看文件内容,如图5.42所示。

$head-n3English显示English文件的前3行/段内容。



图5.42显示文件的前3行/段



从例5.10中可以看到,这里显示的其实是前3段,在Ubuntu中行是以回车或换行符来隔开的。

例5.11带选项查看文件,如图5.43所示。

$head-2 test3显示文件的前2行。

$head-n 2 test3显示文件的前2行。

$head-n -5 test3显示文件除后5行以外的所有内容。



图5.43按照行查看文件



例5.12显示文件的前n个字节,如图5.44所示。

$head-c25test3显示文件的前25个字节。

$head-c-50test3显示文件除了最后50个字节以外的内容。



图5.44按照字节查看文件


5. tail
功能描述: 显示文件的最后n行。
语法: tail[选项][文件名]
选项: tail命令的常用选项如表5.5所示。


表5.5tail命令的常用选项



选项作用

n显示文件的最后n行,系统默认值是10
f不断读取文件的最新内容,达到实时监控的目的

例5.13查看文件内容,如图5.45所示。

$tail-3test3显示文件的最后3行。

$tail-n2test3显示文件的最后2行。

$tail-ftest3显示文件内容,并且不断刷新。按Ctrl+Z组合键退出实时监控。



图5.45使用tail命令查看文件内容


6. echo

功能描述: 输出字符串到基本输出,通常是在显示器上输出,输出的字符串间以空白字符隔开,并在最后加上换行号。

echo命令的功能是在显示器上显示一段文字,一般起到提示的作用。该命令在Shell编程中极为常用,如检查变量value的取值时,可以利用echo命令将value值打印到显示器上。
语法: echo[选项] 字符串
选项: echo的常用选项如表5.6所示。
如图5.46所示,在echo命令中选项n表示输出文字后不换行; 字符串能加引号,也能不加引号; 用echo命令输出加引号的字符串时,将字符串原样输出; 用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分隔。


表5.6echo的常用命令选项



选项作用选项作用

n不输出末尾的换行符\b退格
e启用反斜线转义\\反斜线
\a发出警告声\n另起一行
\c最后不加上换行符号\r回车
\f换行但光标仍旧停留在原来的位置\t插入Tab
\nnn插入nnn(八进制)所代表的ASCII字符\v垂直制表符




图5.46echo命令输出内容


例5.14输出内容,如图5.47所示。

$echo-e"I \nlike\nyou!"输入"I like you!",\n表示换行。



图5.47echo  e输出内容


7. od
功能描述: od命令用于输出文件的八进制、十六进制或其他格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符。
语法:  od[选项] 字符串
选项: od命令的常用选项如表5.7所示。


表5.7od命令的常用选项



选项作用

a表示ASCII码的名字
b按照3个数值位的八进制数进行解释
c选择ASCII码字符或者是转义字符
d选择无符号两字节单位
f选择单精度浮点数
I等价于t dI,选择十进制整型
l等价于t dL,选择十进制长整型
o等价于t o2,选择两字节单元并按照八进制解释
s等价于t d2,选择两字节单元并按照十进制解释
x等价于t x2,选择两字节单元并按照十六进制解释


例5.15按照八进制输出,如图5.48所示。

$ od -b text1.doc使用单字节八进制进行输出。



图5.48以八进制格式输出文件


5.2.2显示目录及文件
1. ls

功能描述: 列出目录的内容,是list的简写形式。
语法: ls[选项][文件或目录]
选项:  ls命令的常用选项如表5.8所示。


表5.8ls命令的常用选项



选项作用

a显示所有文件,包括隐藏文件(以“.”开头的文件和目录是隐藏的),还包括本级目录“.”和上一级目录“..”
A显示所有文件,包括隐藏文件,但不列出“.”和“..”
b显示当前工作目录下的目录
l使用长格式显示文件的详细信息,包括文件状态、权限、拥有者,以及文件大小和文件名等
F附加文件类别,符号在文件名最后
d如果参数是目录,只显示其名称而不显示其下的各个文件
t将文件按照建立时间的先后次序列出
r将文件以相反次序显示(默认按英文字母顺序排序)
R递归显示目录,若目录下有文件,则以下的文件也会被依序列出
i显示文件的inode(索引节点)信息

例5.16l使用长格式显示文件的详细信息,包括文件状态、权限、拥有者,以及文件大小和文件名等,如图5.49所示。

$ls-lwork将work目录下的详细信息列出来。



图5.49查看详细信息


选项l会显示文件的详细信息,各列的含义如下。
第1列表示是文件还是目录(d开头的为目录)。
第2列表示如果是目录,则是目录下的子目录和文件数目; 如果是文件,则是文件的数目或文件的链接数。
第3列表示文件的所有者名字。
第4列表示所属的组名字。
第5列表示文件的字节数。
第6~8列表示上一次修改的时间。
第9列表示文件名。
例5.17带参数显示目录下的内容,如图5.50所示。

$ls-a列出当前目录下的所有文件和目录,包括隐藏文件。

$ls-A列出当前目录下的所有文件和目录,包括隐藏文件,不包括.和..。

$ls-R递归显示,若目录下还有目录,则其下的文件也会被依序列出。

$ls-R-l以递归的形式显示当前目录下文件或目录的详细信息。

$lsDocuments列出/Documents下的文件和目录。

$ls -FDocuments列出/Documents下的文件和目录,在目录后加斜线以区分。



图5.50带参数查看当前目录下的内容



例5.18/bin目录下显示的是Linux 的命令,命令包括内部命令和外部命令。在/bin下显示文件名的是外部命令,没有显示的是内部命令。如图5.51所示,pwd、ls、touch是外部命令,cd 是内部命令。


图5.51查看/bin下的命令文件



例5.19显示文件的inode索引节点的信息,如图5.52所示。

$ls-il显示当前目录下每个文件的索引节点号。



图5.52查看文件的信息及索引节点号


这里所说的inode,中文译名为“索引节点”,与文件的存储有关。

文件存储在硬盘上,硬盘的最小存储单位叫作“扇区”(sector)。每个扇区存储512B(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续8个sector组成一个block。文件数据都存储在“块”中,那么很显然,我们还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等。
这种存储文件元信息的区域就叫作inode,ls i则显示了文件的这一信息。
inode包含文件的元信息,具体来说有以下内容。
(1) 文件的字节数。
(2) 文件拥有者的User ID。
(3) 文件的Group ID。
(4) 文件的读、写、执行权限。
(5) 文件的时间,共有三个: ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
(6) 链接数,即有多少文件名指向这个inode。
(7) 文件数据block的位置。
可以用stat命令,查看某个文件的inode信息,如图5.53所示。总之,除了文件名以外的所有文件信息,都存在inode之中。


图5.53查看文件的indoe信息


2. pwd
功能描述: 显示当前工作目录的完整路径。
语法: pwd
选项: pwd的常用选项如表5.9所示。


表5.9pwd的常用命令选项



选项作用
P如果目录是链接时,显示出实际路径,而非使用链接(link)路径

例5.20查看当前工作路径,如图5.54所示。

 $ pwd查看默认工作目录的完整路径。



图5.54查看当前目录的路径


3. cd
功能描述: 改变当前工作目录。把希望进入的目录名称作为参数,从而在目录间进行移动,目录名称可以是工作目录下的子目录名称,也可以是系统中任何目录的全路径名。想要回到主目录,只需要直接输入cd或cd~。
语法: cd [目录] 
例5.21回到上一级目录,如图5.55所示。

$cd ..返回上一级路径。



图5.55返回上一级路径


例5.22切换到用户的主目录,如图5.56所示。

$cd~回到用户的主目录。



图5.56切换当前目录


5.2.3文件创建、删除命令
1. touch

功能描述: 生成空文件和修改文件存取时间。当执行了touch命令后,文件的创建时间或修改时间会更新为当前系统的时间,如果文件不存在,就会自动添加一个空文件。
语法: touch[选项][文件名] 
选项:  touch命令的常用选项如表5.10所示。


表5.10touch命令的常用选项



选项作用

d以yyyymmdd的形式给出要修改的时间,而非现在的时间
a只更改存取时间
c不建立任何文档
f此参数将忽略不予处理,仅负责解决BSD版本指令的兼容性问题
m只更改变动时间
r把指定文档或目录的日期时间设成参考文档或目录的日期时间

例5.23创建新的空文件,如图5.57所示。

$touch t1t2创建新的空文件t1和t2。



图5.57创建新的空文件


例5.24修改文件的时间,如图5.58所示。

$touch -r a t1将t1的文件时间更改为和文件a一样的文件时间。



图5.58修改文件的时间


例5.25指定修改文件的时间,如图5.59所示。

$touch -dtimefilename将filename的文件时间更改为指定的时间。



图5.59指定修改文件的时间


2. rm
功能描述: 删除一个目录中的若干个文件或子目录。在默认情况下,rm命令只能删除指定的文件,而不能删除目录,如果删除目录必须加参数r。
注意: 一旦用命令删除文件,不容易恢复。
语法: rm[选项][文件或目录] 
选项: rm命令的常用选项如表5.11所示。


表5.11rm命令的常用选项



选项作用

f强制删除。忽略不存在的文件,不提示确认
i在删除前会有提示,需要确认


续表


选项作用

I在删除超过3个文件时或在递归删除前需要确认
r(R)递归删除目录及其内容(无该选项时只删除文件)

例5.26删除文件,删除前确认,如图5.60所示。

$rm-i*.doc删除所有.doc文件,执行前系统会先询问是否删除。



图5.60删除文件前确认



例5.27删除目录及其下的子目录和文件,如图5.61所示。

$rm-ridocuments删除目录documents及其下的子目录d1和d1目录中的文件。



图5.61删除目录及其下子目录和文件


例5.28I和i的区别。I删除子目录前一次性确认,i删除子目录前逐个确认,如图5.62所示。

$rm-ricc逐个确认删除cc子目录。

$rm-rIcc一次性确认删除cc子目录。



图5.62I和i的区别






5.2.4目录创建、删除命令
1. mkdir


功能描述: mkdir命令用来创建指定名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。
语法:  mkdir[选项][目录名] 
选项:  mkdir命令的常用选项如表5.12所示。


表5.12mkdir命令的常用选项



选项作用

p依次创建目录,需要时创建目标目录的上级目录
m设置权限模式,在建立目录时按模式指定设置目录权限
v每次创建新目录都显示执行过程信息

其中的m选项用来设置目录的权限。对目录的读权限是4、写权限是2、执行权限是1,这三个数字的和表达了对该目录的权限,如7代表同时具有读、写和执行权限,6代表具有读和写的权限,4则代表只有读的权限。

m的格式为mkdir m [参数] [目录名],这里的参数由三位如上所述的数字组成,分别代表目录所有者的权限、组中其他人对目录的权限和系统中其他人对目录的权限。常用的组合如表5.13所示。


表5.13m参数的含义



参数含义

600只有所有者有读和写的权限
644所有者有读和写的权限,组用户只有读的权限
666每个人都有读和写的权限
700只有所有者有读和写以及执行的权限
777每个人都有读和写以及执行的权限


例5.29创建目录,如图5.63所示。

$mkdirc-language在当前目录下创建子目录c-language。



图5.63创建目录


例5.30依次创建目录,如果上级目录不存在,则同时创建上级目录,如图5.64所示。

$mkdir-paaa/test创建子目录aaa,并在其下建立子目录test。



图5.64创建目标及父目录


例5.31同时创建多个目录,如图5.65所示。

$mkdir -vp scf/{lib/,bin/,doc/{info,product}}

创建目录scf; scf下创建目录lib、bin、doc; doc下创建目录info、product,并显示过程。



图5.65逐层创建、查看创建的多级目录


例5.32创建新目录,同时设置访问权限,如图5.66所示。

$mkdir -m 777 test4创建目录test4,每个人对该目录都有读、写和执行的权限。



图5.66创建新目录并设置权限


例5.33只能在自己的工作目录下建立子目录,否则必须具有超级用户权限,如图5.67所示。

$mkdir -m 700d11在根目录下创建子目录d11,只有超级用户才可以建立。



图5.67root权限创建目录


2. rmdir

功能描述: 删除空目录。在操作系统中,有时会出现比较多的空目录,这是可以使用目录删除命令rmdir将它们都删除。rmdir命令只能删除空目录,如果有文件需要先删除文件。
语法: rmdir[选项][目录列表] 
选项:  rmdir命令的常用选项如表5.14所示。


表5.14rmdir命令的常用选项



选项作用

p当子目录被删除后其父目录为空目录时,也一起被删除
v显示详细的进行步骤

可使用空格来分隔多个目录名(称为目录列表),同时删除多个目录。注意: 要删除的目录必须为空,如果其下有文件,需要先将文件删除。
例5.34删除目录,如图5.68所示。

$rmdir c-language删除当前目录下的子目录c-language。



图5.68删除目录



例5.35删除目标目录,删除后如果上级目录成为空目录,则同时删除,如图5.69所示。


图5.69删除目标及上级目录



$rmdir -p aaa/test删除目标目录test和上级目录aaa(aaa下只有test一个子目录)。



例5.36删除带文件目录,如图5.70所示。

$rm *删除目录test2下的所有文件。

$rmdirtest2删除目录test2。



图5.70先删文件后删目录



从图5.70中可以看出,rmdir只能删除空白目录,如果目录不空(如test2),则不能删除,需要先删除文件再删除目录。
例5.37显示删除的详细过程,如图5.71所示。



图5.71删除目录并显示过程



$rmidr-vtest2删除目录test2并显示过程(test2不是空白目录不能删除)

$rmidr-vtest1删除目录test1并显示详细步骤


5.2.5复制、移动命令
1. cp

功能描述: 将文件或目录复制到另一个文件或目录中。如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息。
语法: cp[选项] [源文件或目录] [目的文件或目录]

cp[选项]源文件组目标目录
cp命令可以复制多个文件,将要复制的多个文件用空格分隔,所形成的列表称为源文件组。
选项: cp命令的常用选项如表5.15所示。


表5.15cp命令的常用选项



选项作用

b将要覆盖的文件做备份,但不接受参数递归时特殊文本的副本内容
i覆盖前查询,提示是否覆盖已存在的目标文件
f强制复制文件,若目标文件无法打开则将其移除并重试
p保留源文件或目录的属性,如日期
R复制所有文件及目录
a不进行文件数据复制,只对每一个现有目标文件的属性进行备份
H跟踪源文件中的命令行符号链接
l链接文件而不复制
L总是跟随源文件中的符号链接
n不要覆盖已存在的文件
P不跟随源文件中的符号链接
s只创建符号链接而不复制文件
t将所有参数指定的源文件/目录复制到目标目录下
T将目标目录视为普通文件
u只在源文件比目标文件新或目标文件不存在时才进行复制
v显示详细的进行步骤
x不跨越文件系统进行操作

例5.38复制文件,如图5.72所示。

$cptest1/file1test2将test1文件夹下的file1文件复制到目录test2中。



图5.72复制文件


例5.39复制并备份已有文件,如图5.73所示。

$cp -i a1 a2复制文件a1为a2,如果文件a2存在,则询问是否覆盖a2。

$cp -b a1 a2复制文件a1为a2,若a2存在,则将a2备份为a2~。



图5.73复制文件并覆盖原文件


例5.40复制文件,如果目标目录不存在则无法复制,如图5.74所示。

$cp f1 f2 dir1复制文件f1和f2到目录/dir1。

$cp f1 f2 dir2复制文件f1和f2到目录/dir2,若该目录不存在,则报错。



图5.74复制文件到目标目录


2. mv
功能描述: 将文件或目录改名,或将文件由一个目录移入另一个目录。
语法: mv[选项] [源文件或目录] [目的文件或目录] 
选项: mv命令的常用选项如表5.16所示。


表5.16mv命令的常用选项



选项作用

f禁止交互模式,本选项会使mv命令执行移动而不给出提示(在权限足够的情况下直接执行; 如果目标文件存在但用户没有写权限时,mv会给出提示)
i交互模式,当移动的目录已存在同名的目标文件名时,用覆盖方式写文件,但在写入之前系统会询问用户是否重写,要求用户回答y或者n,这样可以避免误覆盖文件
n不要覆盖已存在的文件
u只在源文件比目标文件新或者目标文件不存在时才进行移动
v显示详细的进行步骤

例5.41移动文件,如图5.75所示。

$mv -vtest1/file2test2将test1目录中的file2文件移动到目录test2中。



图5.75移动文件


例5.42更改文件名字,如图5.76所示。

$mv1.txt11.txt将文件1.txt更名为11.txt。

$mv2.txt11.txt将文件2.txt更名为11.txt,原11.txt被覆盖。

$mv-i3.txt11.txt将文件3.txt更名为11.txt,覆盖原11.txt之前询问。



图5.76移动并覆盖同名文件


5.2.6压缩、备份命令
1. tar压缩、解压缩

功能描述: tar命令是在Ubuntu中广泛应用的压缩解压命令,可以把许多文件打包成为一个归档文件或者把它们写入备份文件。tar可以对文件和目录进行打包,能支持的格式为tar、gz等。

语法: tar[选项] [目标文件名][源文件名]
选项: tar命令的选项如表5.17所示。


表5.17tar命令的选项



选项作用

z使用gzip或者gunzip压缩格式处理备份文件。如果配合选项c使用是压缩,配合选项x使用是解压缩
c创建一个新的压缩文件,格式为.tar
v显示过程
f指定压缩后的文件名
x从压缩文件中还原文件
u仅转换比压缩文件新的内容
r新增文件至已存在的压缩文件中结尾部分

例5.43压缩小文件,如图5.77所示。

$tar-zcf111.tar11.txt将11.txt文件压缩成tar格式,并命名为111.tar。



图5.77压缩小文件



对于很小的文件,在进行tar打包并压缩或者zip压缩时,其占用的磁盘空间会比源文件大很多(11.txt大小为84KB压缩后 111.tar为147KB)。
例5.44压缩多个文件,并显示过程,如图5.78所示。

$tar-czvfdoc.tar.gz*.doc将目录中所有doc文件打包成doc.tar后并用gzip压缩,生成一个gzip压缩过的包,命名为doc.tar.gz,显示过程。



图5.78压缩多个文件


例5.45压缩大于500MB的文件,如图5.79所示。

$tar-czfVM.tarVMware-workstation-full-15.1.0-13591040.exe 将大文件压缩。



图5.79压缩大于500MB的文件


压缩大文件(500MB以上)时,压缩比例在10%左右。
例5.46压缩、打包目录,如图5.80所示。


图5.80压缩、打包目录



$tar-czvfd11.tard1将目录d1打包压缩成d11.tar文件。

例5.47解压缩文件,如图5.81所示。

$tar-xvfdoc.tar.gz将压缩包doc.tar.gz解压缩到当前目录。



图5.81解压缩文件


这里需要注意,解压缩时必须先进入目标目录,然后再解压缩。如果当前目录不是目标目录,而是把目标目录写到了命令中,会出现错误,如图5.82所示。


图5.82加目标路径后解压缩出错


一般情况下,小于0.5MB的文件,在进行tar打包并压缩或者zip压缩时,其占用的磁盘空间会比源文件大很多; 大于0.5MB的文件,在进行tar打包并压缩或者zip压缩时,其占用的磁盘空间大小不变; 中等文件(100MB左右的PDF文件),在进行tar打包并压缩或者zip压缩时,大约节省20%~30%的空间; 对于大文件(500MB),大约节省10%空间,也会由于文件类型不同,压缩比例有所不同。
2. gzip只压缩不打包

功能描述: gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,用Lempel Ziv coding(LZ77)技术压缩文件,压缩后文件格式为.gz,只压缩不打包。gzip不仅可以用来压缩大的、较少使用的文件以节省磁盘空间,还可以和tar命令一起构成Linux操作系统中比较流行的压缩文件格式。据统计,gzip命令对文本文件有60%~70%的压缩率。
语法: gzip[选项]要压缩的源文件名 
选项: gzip命令的常用选项如表5.18所示。


表5.18gzip命令的常用选项



选项作用

1数字1,表示快速压缩
99代表最佳状况压缩,读音nine约等于nice
r递归式地查找指定目录并压缩其中的所有文件或者是解压缩
c压缩结果写入标准输入,源文件保持不变
v对每一个压缩和解压的文件,显示文件名和压缩比
d解压缩指定文件
t测试压缩文件的完整性
l对每个压缩文件,显示压缩文件的大小、未压缩文件的大小、压缩比、未压缩文件的名字等详细信息

例5.48压缩、解压缩文件,如图5.83所示。

$gzip-9a.txt以最佳压缩比压缩文件a.txt,生成a.txt.gz。

$gzip-da.txt.gz将压缩包a.txt.gz解压缩到当前目录。



图5.83压缩、解压缩文件


例5.49压缩多个文件,如图5.84所示。

$gzip*压缩当前目录下的所有文件为.gz 文件。



图5.84压缩多个文件


例5.50压缩目标目录下的文件并解压缩,如图5.85所示。

$gzip-rDocuments压缩Documents下的所有文件为.gz 文件。

$gzip-drDocuments解压缩Documents下的所有文件。



图5.85解压缩目标目录下的文件


3. gunzip
功能描述: 解压缩以gzip压缩的.gz文件。
语法: gunzip[选项][文件或目录] 
选项:  gunzip命令的常用选项如表5.19所示。


表5.19gunzip命令的常用选项



选项作用

a使用ASCII文字模式
d解压文件
c把解压后的文件输出到标准输出设备
f强行解压压缩文件,不理会文件名称或硬链接是否存在
h在线帮助
l列出压缩文件的相关信息
L显示版本与版权信息
n解压文件时,若压缩文件内容含有原来的文件名称及时间戳记,则将其忽略不予处理
p不显示警告信息
r递归处理,将指定目录下的所有文件及子目录一并处理
S更改压缩字尾字符串
t测试压缩文件是否正确无误
v显示指令执行过程

例5.51解压缩文件,如图5.86所示。

$gunzip-drDocuments 解压缩Documents下的所有.gz文件。



图5.86解压缩指定目录下的.gz文件



对于文件,如果不加任何参数,gzip是压缩,gunzip是解压缩。
4. zip压缩打包
功能描述: zip是一个压缩和归档工具,压缩文件时使用zip命令。会创建一个带.zip扩展名的zip文件,如果没有指定文件,则zip会将压缩数据输出到标准输出。
语法: zip[选项]压缩后生成的目标文件名源文件名
选项: zip命令的常用选项如表5.20所示。


表5.20zip命令的常用选项



选项作用

f以新文件取代现有文件
u只更新改变过的文件和新文件
d从 zip 文件中移出一个文件
m将特定文件移入 zip 文件中,并且删除特定文件
r递归压缩子目录下的所有文件,包括子目录
续表



选项作用

j只存储文件的名称,不含目录
1最快压缩,压缩率最差
9表示最慢速度的压缩(最佳压缩),预设值为-6
q安静模式,不会显示相关信息和提示
v显示版本资讯或详细信息

例5.52压缩单个文件,如图5.87所示。

#ziptest2.ziptest2 将文件test2压缩为test2.zip。



图5.87压缩单个文件


例5.53递归压缩,如图5.88所示。

#zip-rtest.zip./*将当前目录下的所有子目录和文件递归压缩为test.zip
。



图5.88压缩当前目录下的所有文件和文件夹



例5.54删除压缩文件中的部分文件,如图5.89所示。

#zip-dtest.ziptouch删除压缩文件test.zip中的文件touch。

#zip-dtest.ziptest2/file2 删除压缩文件test.zip中的test2目录下的file2文件。



图5.89删除压缩包中的部分文件


例5.55向压缩文件中添加文件,如图5.90所示。

#zip-mtest.ziptouch向压缩文件test.zip中添加touch文件。



图5.90添加文件到压缩包


例5.56压缩文件时排除某个文件,如图5.91所示。

#ziptest.zip./*-xtest2/file1压缩当前目录下所有文件,除了test2/file1文件。



图5.91设置压缩范围


5. unzip
功能描述: 解压缩zip文件。
语法: unzip[选项]压缩文件名
选项: unzip命令的常用选项见表5.21。


表5.21unzip命令的常用选项



选项作用

x“文件列表” 解压文件,但不包含文件列表中指定的文件
t测试压缩文件有无损坏,并不解压
v查看压缩文件的详细信息,具体包括压缩文件中包含的文件大小、文件名和压缩比等,并不解压
n解压时不覆盖已经存在的文件
o解压时覆盖已经存在的文件,并且不要求用户确认
d按目录名把压缩文件解压到指定目录下

例5.57解压缩文件,如图5.92所示。

#unziptest.zip将test.zip压缩文件直接解压到当前目录。



图5.92解压缩文件


例5.58解压缩文件到指定目录,如图5.93所示。

#unzip-ntest.zip-d/home/malimei/Documents将test.zip压缩文件解压到目录/home/malimei/Documents下。



图5.93解压缩文件到指定目录



与tar命令不同,在unzip命令后面添加d就可以指定目标目录,而不需要必须进入目标目录再解压缩。
例5.59解压缩并覆盖已有文件,如图5.94所示。

$unzip-otest.zip-d/home/malimei/Documents将压缩文件test.zip解压到目录/home/malimei/Documents下,如有相同文件则覆盖。



图5.94解压缩并覆盖已有文件


例5.60查看压缩文件,如图5.95所示。

$unzip-vcc1.zip查看压缩文件cc1.zip的详细信息。



图5.95查看压缩文件






5.2.7权限管理命令
1. chgrp


功能描述: 改变文件或目录的所属组。在Linux系统中,文件或者目录的权限由拥有者和所属群组来管理,采用群组名称或者群组识别码来标记不同权限,超级用户拥有最大权限。chgrp命令是change group的缩写,要被改变的组名必须在/etc/group文件内存在才可以,默认情况下只有root权限才能执行。
语法: chgrp[选项] [群组] [文件或目录] 
选项: chgrp命令的常用选项见表5.22。


表5.22chgrp命令的常用选项



选项作用

R处理指定目录以及其子目录下的所有文件
c当发生改变时输出调试信息
f不显示错误信息
续表



选项作用

v运行时显示详细的处理信息
dereference作用于符号链接的指向,而不是符号链接本身
nodereference作用于符号链接本身
reference=文件1,文件2,改变文件2所属群组,使其与文件1相同

例5.61改变文件的群组属性并显示过程,如图5.96所示。

$chgrp-vbintar1.doc将tar1.doc文件由malimei群组改为bin。



图5.96更改文件所属的群组



例5.62根据指定文件改变文件的群组属性,如图5.97所示。

$chgrp --reference=tar2.doctar1.doc改变tar1.doc文件所属群组,使其与tar2.doc相同。



图5.97改变文件群组属性与指定文件相同


例5.63递归改变多个文件的群组属性,如图5.98所示。

$chgrp-Rmalimeitest1递归改变目录test1及其下文件的所属群组为malimei。



图5.98递归改变目录及其下文件的群组属性


从该例可以看出,添加了参数R后,test1目录及目录中的文件所属的组都改变为malimei组,这是一种递归改变。如果不添加参数R,仅改变目录test1的组,但是目录中的文件所属的组没变,如图5.99所示。


图5.99仅改变目录的群组属性


2. chown
功能描述: chown是change owner的简写,将文件或目录的所有者改变为指定用户,还可以修改文件所属组群。如果需要将某一目录下的所有文件都改变其拥有者,可以使用R参数。
语法:  chown [选项] [用户[: 群组]] [文件或目录] 
选项: chown命令的常用选项见表5.23。


表5.23chown命令的常用选项



选项作用

c显示更改的部分信息
f忽略错误信息
R处理指定目录以及其子目录下的所有文件,递归式地改变指定目录及其下的所有子目录和文件的拥有者
v显示详细的处理信息
reference=<目录或文件>把指定的目录/文件作为参考,把操作的目录/文件设置成参考文件/目录相同所有者和群组

例5.64改变文件所有者及所属组,如图5.100所示。

$chownroot:binfile1将file1文件的所有者改为root,所属群组为bin。



图5.100改变文件所有者及所属组


例5.65更改目录及子目录所有者,如图5.101所示。

$chown-Rmalimeitest1将test1目录及其下文件的所有者更改为malimei。



图5.101更改目录及子目录所有者


从例5.65可以看出,chown命令是在超级用户下执行的,需要root权限。
例5.66更改所有者实例。
文件11.txt的所有者是malimei,更改所有者为user1,转到user1用户下,user1用户就可以对11.txt文件进行编辑、修改,如图5.102所示。如果不是这个文件的所有者,也不是同组人,就是其他人,那么就不能修改文件,如user2用户就不能修改11.txt文件,如图5.103所示。


图5.102更改文件的所有者




图5.103其他人不能修改文件


3. chmod
功能描述: 改变文件或目录的访问权限。

在Linux系统中,用户设定文件权限控制使其他用户不能访问、修改。但在系统应用中,有时需要让其他用户使用某个原来其不能访问的文件或目录,这时就需要重新设置文件的权限,使用的命令是chmod命令。并不是谁都可改变文件和目录的访问权限,只有文件和目录的所有者才有权限修改其权限。另外,超级用户可对所有文件或目录进行权限设置。

文件或目录的访问权限分为只读、只写和可执行三种。文件所有者拥有对该文件的读、写和可执行权限,用户也可根据需要把访问权限设置为需要的任何组合。访问文件的用户有三种类型: 文件所有者、组成员用户和普通用户,他们都有各自的文件访问方式。

语法: chmod[选项] [模式] 文件
chmod命令有两种模式: 符号模式和绝对模式。
选项: chmod命令的常用选项如表5.24所示。


表5.24chomd命令的常用选项



选项作用

v运行时显示详细的处理信息
c显示改变部分的命令执行过程
f不显示错误信息
R将指定目录下的所有文件和子目录做递归处理
reference=<目录或者文件>设置成与指定目录或者文件具有相同的权限

下面分别介绍该命令的两种不同模式。
1) 符号模式

chmod[选项][who]operator[permission]files

其中,who、operator和permission的选项如表5.25~表5.27所示。


表5.25chmod命令的who选项



选项作用

a所有用户均具有的权限
o除了目录或者文件的当前用户或群组以外的用户或者群组
u文件或目录的当前所有者
g文件或者目录的当前群组



表5.26chmod命令的operator选项



选项作用

+增加权限
-取消权限
=设定权限


表5.27chmod命令的permission选项



选项作用

r读权限
w写权限
x执行权限


2) 绝对模式

chmod[选项]modefiles

其中,mode代表权限等级,由三个八进制数表示。

这三位数的每一位都表示一个用户类型的权限设置,取值是0~7,即二进制的[000]~[111]。这个三位二进制数的每一位分别表示读、写、执行权限,如000表示三项权限均无,100表示只读。这样,就有了下面的对应。
0 [000]: 无任何权限。
1 [001]: 执行权限。
2 [010]: 写权限。
3 [011]: 写、执行权限。
4 [100]: 只读权限。
5 [101]: 读、执行权限。
6 [110]: 读、写权限。
7 [111]: 读、写、执行权限。
三个如上所示的二进制字符串([000]~[111])构成了模式,第一位表示所有者的权限,第二位表示组用户的权限,第三位表示其他用户的权限。常用的模式如下。
600: 只有所有者有读和写的权限。
644: 所有者有读和写的权限,组用户只有读的权限。
700: 只有所有者有读和写以及执行的权限。
666: 每个人都有读和写的权限。
777: 每个人都有读、写以及执行的权限。
例5.67查看文件的权限,如图5.104所示。

$ls-l查看当前目录下所有文件及子目录的详细信息。



图5.104查看文件的权限


在图5.104中,ls命令显示了文件或目录的详细信息,其中最左边一列(第一个字母除外)为文件的访问权限。具体如下。
r: 表示文件可以被读(read)。
w: 表示文件可以被写(write)。
x: 表示文件可以被执行(如果它是程序的话)。
-: 表示相应的权限还没有被授予。
例5.68符号模式下添加可执行权限,如图5.105所示。

#chmoda+xfile1给file1文件所有用户增加可执行权限。



图5.105设置文件权限为所有用户可执行



例5.69符号模式下设置文件仅可执行,如图5.106所示。

#chmodu=xfile1设置文件file1所有者的权限为可执行。



图5.106设置文件权限为只可读


从图5.106可以看到,使用“=x”选项时,文件file1所有者的权限从“rwx”变为“x”,即原有的权限被撤销,重新设置为仅可执行。这与“+”选项不同。

例5.70符号模式下设置文件的多重权限,如图5.107所示。

#chmodug+w , o-xfile1给file1文件的所有者和文件属群增加写权限,删除其他用户的执行权限。



图5.107设置文件的多重权限


从例5.70可以看出,在符号模式下可以使用“,”来连接多个选项,为所有者、所属群和其他用户分别设置不同的权限。
例5.71符号模式下设置文件的多重权限,如图5.108所示。

$sudo chmodu+x,g-r,o+wcc1为所有者添加执行权限,同组人去掉读权限,其他人(普通人)加上写的权限。



图5.108设置文件的多重权限


例5.72绝对模式下设置对文件的权限,如图5.109所示。

$ chmod712cc1设置a的权限: 所有者具有读、写和执行权限,同组人具有可执行权限,其他人具有写权限。

从例5.72中可以看出,文件的所有者不使用sudo命令,可以更改文件的权限。


图5.109绝对模式下设置文件的权限



注意: 符号模式和绝对模式不能混着用,要遵循各自的格式。如图5.110所示的命令“chmod uwg+7o+1a”,既然使用了符号模式,那么permission选项只能使用“r”“w”“x”,不能采用绝对模式中用数字表示权限的方法。



图5.110符号模式和绝对模式不能混淆



例5.73文件lx属于malimei用户,我们看到同组人对文件lx有rw的权限,把user2用户加到malimei组里,就是同组人,如图5.111所示。user2就可以修改文件malimei用户的文件了,如图5.112所示。


图5.111加入同组人




图5.112同组用户user2修改属于malimei用户的文件a


5.2.8文件查找命令
文件查找命令有whereis、find和locate。和find相比,whereis查找的速度非常快,当使用whereis和locate时会从Linux的数据库中查找数据,但是该数据库并不是实时更新的,默认情况下是一星期更新一次。因此,在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件却无法查找到,原因就是因为数据库文件没有被更新。
1. whereis
功能描述: 寻找命令的二进制文件,同时也会找到其帮助文件。
这个程序的主要功能是寻找一个命令所在的位置,例如,最常用的ls命令,它是在/bin这个目录下的。如果希望知道某个命令存在哪一个目录下,可以用whereis命令来查询。但是whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数b)、帮助文件(参数m)和源代码文件(参数s)。如果省略参数,则返回所有信息。
语法: whereis[选项][文件名] 
选项: whereis命令的常用选项如表5.28所示。


表5.28whereis命令的常用选项



选项作用

b定位可执行文件
m定位帮助文件
s定位源代码文件
u搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其他文件
B指定搜索可执行文件的路径
M指定搜索帮助文件的路径

例5.74搜索命令,如图5.113所示。

$whereis ls搜索ls命令的路径。

$whereis find搜索find命令的路径。

$whereis tar搜索tar命令的路径。



图5.113搜索命令的路径


例5.75搜索命令的帮助文件,如图5.114所示。

$whereis-mls搜索ls的帮助文件。

$whereis-mfind搜索find的帮助文件。

$whereis-mtar搜索tar的帮助文件。



图5.114搜索命令的帮助文件(man)的路径


2. help
功能描述: 查看命令的内容和使用方法。
whereis只查找命令文件的路径,要想查看命令的内容和使用方法,则可以使用help命令,help用于查看所有Shell命令。
语法: help[选项][命令]
选项: help命令的常用选项见表5.29。


表5.29help命令的常用选项



选项作用

s输出短格式的帮助信息,仅包括命令格式
d输出命令的简短描述,仅包括命令的功能
m仿照man格式显示命令的功能、格式及用法

例5.76查看命令的帮助文件,如图5.115所示。

$helphelp查看help命令的帮助文件,显示该命令的内容和使用方法。



图5.115查看help命令的内容和使用方法


例5.77分别查看命令的格式、功能和详细帮助信息,如图5.116所示。


$help-scd查看cd命令的格式。

$help-dcd查看cd命令的功能。

$helpcd查看cd命令的帮助信息。



图5.116带参数查看命令cd的帮助


例5.78查看命令ls的帮助信息,如图5.117所示。

$ ls --help查看ls命令的帮助信息,给出了用法和各个选项。



图5.117查看ls命令的帮助信息


注意: 使用help查看命令的帮助信息时需要区分是内部命令还是外部命令: 对于内部命令格式为help <命令>,如前面的例5.76、例5.77; 而外部命令需要使用<命令>help格式,如例5.78。
3. man
功能描述: 查看命令的帮助手册。
查找命令的帮助信息更常用的是man命令。man用来查看帮助手册,通常使用者只要在命令man后输入想要获取的帮助命令的名称(例如ls),man就会列出一份完整的说明,其内容包括命令语法、各选项的意义以及相关命令等。
语法: man[选项]命令名称
选项: man命令的常用选项见表5.30。


表5.30man命令的常用选项



选项作用

s根据章节显示,具体见后面的说明
f只显示出命令的功能而不显示其中详细的说明文件
w不显示手册页,只显示将被格式化和显示的文件所在位置
a显示所有的手册页,而不是只显示第一个
E在每行的末尾显示$符号


其中,选项s是根据章节显示帮助,常用的章节选项见表5.31。


表5.31选项s的章节参数



章 节 参 数作用

1一般使用者的命令
2系统调用的命令
3C语言函数库的命令
4有关驱动程序和系统设备的解释
5配置文件的解释
6游戏程序的命令
7其他的软件或程序的命令和有关系统维护的命令

例5.79查看ls命令的帮助手册,如图5.118所示。

$man-s1ls查看ls命令的帮助手册



图5.118查看ls命令的帮助手册


从例5.79中可以看出,ls是一般使用者的命令,加s参数时用“1”选项。如果用其他章节参数会提示错误。

使用man命令后会显示所查看命令的man文件。如图5.119所示,可以使用鼠标上下滑动来翻页,按Q键退出帮助手册返回命令界面。


图5.119命令ls的帮助手册


4. find
功能描述: 寻找文件或目录的位置。

如果有大量的文件保存在许多不同的目录中,可能需要搜索它们,以便能找出某种类型的一个或者多个文件,这就需要find命令。find命令可以按照文件名、类型、所有者甚至最后更新的时间来搜索文件。
语法: find [搜索路径] [搜寻关键字] [文件或目录]
选项: find命令的常用选项如表5.32所示。


表5.32find命令的常用选项



选项作用

type查找某一类型的文件,具体参数见后面说明
name按照文件名查找文件
group按照文件所属的组来查找文件
user按照文件所有者来查找文件
printfind命令将匹配的文件输出到标准输出
link按照文件的链接数来查找文件
size n : [c]查找文件长度为n块的文件,带有c时表示文件长度以字节计
newer file1 ! file2查找更改时间比文件file1新,但比文件file2旧的文件
perm按照文件权限来查找文件
depth在查找文件时,首先查找当前目录中的文件,然后在其子目录中查找
prune不在指定的目录中查找,如同时使用depth选项,prune将被忽略
nogroup查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在
nouser查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在

其中,选项type表示按照文件类型查找文件,具体的参数见表5.33。


表5.33type选项参数



type参数作用type参数作用

b块设备文件p管道文件
d目录l符号链接文件
c字符设备文件f普通文件

另外,find命令还可以利用时间特征来查找文件,其参数见表5.34。


表5.34时间特征参数



时 间 参 数作用

amin n查找n分钟以内被访问过的所有文件
atime n查找n天以内被访问过的所有文件
cmin n查找n分钟以内文件状态被修改过的所有文件
ctime n查找n天以内文件状态被修改过的所有文件
mmin n查找n分钟以内文件内容被修改过的所有文件
mtime n查找n天以内文件内容被修改过的所有文件

下面详细说明find的用法。
(1) 通过文件名查找。
知道了某个文件的文件名,却不知道它存于哪个目录下,此时可通过查找命令找到该文件,命令如下。

# find / -name httpd.conf -print

(2) 根据部分文件名查找。

当要查找某个文件时,不知道该文件的全名,只知道这个文件包含几个特定的字母,此时用查找命令也
可找到相应文件。这时在查找文件名时可使用通配符“*”“?”。例如,还是查找文件httpd.conf,但仅记得该文件名包含“http”字符串,可使用如下命令查找。

#find / -name *http* -print

(3) 根据文件的特征查询。
如果仅知道某个文件的大小、修改日期等特征也可使用find命令把该文件查找出来。例如,知道一个文件尺寸为2500B,可使用如下命令查找。

#find /etc -size -2500c-print

例5.80按照文件名查找文件,如图5.120所示。

$find~-name"*.doc"-print查找当前目录及子目录中扩展名为.doc的文件并显示。

$find.-name"[A-F]*" -print查找以大写字母A~F开头的文件并显示。

$find/etc-iname'f????'
查找/etc下所有以f开头后面有四个字符的文件。


例5.81按照文件权限模式查找文件,如图5.121所示。

$find.-perm777-print在当前目录下查找文件权限为777的文件,
即查找每个人都有可读写可执行权限的文件。


例5.82忽略某个子目录查找文件,如图5.122所示。

$findwork-path"cc/d1"-prune-o-print查找cc文件夹及子文件夹的文件,忽略子文件夹d1。


例5.83按文件所有者、用户组等查找文件,如图5.123所示。

$findwork-usermalimei-print在work文件夹下查找所有者为malimei的文件并输出。

$find/home/malimei/Documents-groupmalimei-print
在Documents文件夹下查找属于malimei用户组的文件。




图5.120按照文件名查找文件




图5.121按照文件权限模式查找文件




图5.122忽略某个子目录查找文件




图5.123按照所有者、用户组等查找文件


例5.84按照时间查找文件,如图5.124所示。

$find /home/malimei/Documents/work-mtime-5-print查找更改时间在5日内的/home/malimei/Documents/work文
件。



图5.124按照时间查找文件


例5.85按照文件类型查找文件,如图5.125所示。

$find/home/malimei/Documents -type d -print 查找指定目录下所有的目录文件并显示。



图5.125按照文件类型查找文件


例5.86按照文件长度查找文件,如图5.126所示。

$find.-size+1000000c-print在当前目录下查找文件长度大于1MB的文件。



图5.126按照文件长度查找文件


5. locate
功能描述: 寻找文件或目录。

locate用于在文件系统内通过搜寻数据库查找指定文件,相对find命令查找速度快。数据库由updatedb程序来更新,updatedb是由crondaemon周期性建立的,locate命令在搜寻数据库时比由整个硬盘资料搜寻来得快,但若所找到的文件是最近才建立或刚更名的,locate命令可能会找不到。updatedb每天会更新一次,可以由修改crontab来更新设定值。

语法: locate [选项] [搜索关键字] 
选项: locate命令的常用选项见表5.35。


表5.35locate命令的常用选项



选项作用选项作用

a输出所有匹配模式的文件h显示辅助信息
d指定文件库的路径q安静模式,不会显示任何错误信息
e将排除在寻找的范围之外V显示程式的版本信息

例5.87查找文件名中包含“x”的文件,如图5.127所示。

$locatex|more查找所有和“x”相关的文件,并用more命令显示。



图5.127查找文件名中包含“x”的文件



例5.88查找指定目录下以“t”开头的文件,如图5.128所示。

#locate/file1/t查找file1文件夹下以“t”开头的文件



图5.128查找“t”开头的文件


相关命令还有: 
whatis命令: 查询命令的功能。
which命令: 显示可执行命令的路径。
例5.89查询命令的功能和可执行路径,如图5.129所示。

$whatisls查询ls命令的功能。

$whichls查询ls命令的可执行路径。



图5.129查询命令的功能和可执行路径


6. grep
功能描述: 使用正则表达式查找文件内容。
语法: grep [选项] 匹配字符串 文件列表
选项: grep命令的常用选项如表5.36所示。


表5.36grep命令的常用选项



选项作用

v列出不匹配串或正则表达式的行,即显示不包含匹配文本的所有行
c对匹配的行计数
l只显示包含匹配的文件的文件名
h查询多文件时不显示文件名,抑制包含匹配文件的文件名的显示
n每个匹配行只按照相对的行号显示
i产生不区分大小写的匹配,默认状态是区分大小写

正则表达式的参数如下。
\: 忽略正则表达式中特殊字符的原有含义。
^x: 匹配正则表达式的开始行,匹配一个字符x。
$: 匹配正则表达式的结束行。
\<: 从匹配正则表达式的行开始。
\>: 到匹配正则表达式的行结束。
[ ]: 单个字符,如[A]即A符合要求。
[  ]: 范围,如[AZ],即A、B、C一直到Z都符合要求。
[^x] : 匹配一个字符,这个字符是除了x以外的所有字符。
*: 有字符,长度可以为0。
例5.90搜索文件中包含“s”的内容,如图5.130所示。

$grep -n "s"1.txt 搜索文件1.txt中包含“s”的行,并显示行号。



图5.130搜索文件中包含“s”的行



图5.131搜索文件的内容


例5.91搜索文件的内容,如图5.131所示。

$grep-n'-'a搜索文件a中
包含
“-”的行,并显示行号。

$grep-vn'-'a搜索文件a中不包含“-”的行,并显示行号。

$grep-n'*'a搜索文件a中包含“*”的行,并显示行号。

$grep-n'[a-z]\{14\}'a搜索文件a中等于14个小写字符的字符串。


例5.92在文件中搜索包含“li”的行,如图5.132所示。

$grep-n 'li'c搜索当前目录下文件c中包含“li”的行。



图5.132在文件中搜索字符串


例5.93搜索当前目录下的文件中包含“any”的行,如图5.133所示。

$grep 'any'*
搜索当前目录下的所有文件中包含“any”的行。



图5.133搜索多个文件的内容


例5.94搜索指定文件中第一个字符不是d,后面是bc的字符串,如图5.134所示。

$ grep-n '[^d]bc'tmp搜索tmp文件中第一个字符不是d,后面是bc的字符串。



图5.134搜索指定的字符串


[^]匹配一个不在指定范围内的字符,例如,'[^AR TZ]rep'匹配
一个不包含A~R和T~Z的字母开头,紧跟rep的行。
5.2.9统计命令wc
功能描述: 统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。
该命令统计给定文件中的字节数、单词数、行数。如果没有给出文件名,则从标准输入设备读取,字符数包括空格和回车键。
语法: wc [选项] 文件列表
选项: wc命令的常用选项见表5.37。



表5.37wc命令的常用选项



选项含义

c统计字节数
w统计字数,一个字被定义为由空白、跳格或换行字符分隔开的字符串
l统计行数
L统计最长行的长度
m统计字符数,不能与c一起使用

例5.95统计行数、字节数和字数,如图5.135所示。

$wc-lcw1.txt统计1.txt 文件的行数、字节数、字数。



图5.135统计行数、字节数和字数


例5.96统计文件的字数等信息,如图5.136所示。

$wc-ctest1统计文件test1字节数。

$wc-wtest1统计文件test1字数。

$wc-ltest1统计文件test1行数。

$wc-Ltest1统计文件test1最长行长度。



图5.136统计文件的字数等信息



注意: 一个字被定义为由空白、跳格或换行字符分隔的字符串,如图5.136中test1的字数为2,而不是28。

5.3输入、输出重定向
5.3.1标准输入、输出

执行一个Shell命令行时通常会自动打开三个标准文档: 标准输入文档(stdin),标准输出文档(stdout)和标准错误输出文档(stderr)。其中,标准输入对应终端的键盘,标准输出和标准错误输出对应终端的屏幕。进程将从标准输入文档中得到输入数据,将正常输出数据输出到标准输出文档,而将错误信息送到标准错误文档中。
以cat命令为例,如果命令“$cat”中不带参数,就会从标准输入中读取数据,并将其送到标准输出上。
例5.97从键盘输入数据到显示屏,如图5.137所示。

$ cat从标准输入到标准输出。

Hello!在键盘上输入“Hello!”。

Welcome to Ubantu!在键盘上输入“Welcome to Ubantu!”。



图5.137标准输入输出


注意: 图5.137中第一行“Hello!”是通过键盘输入时的显示,第二行才是输出。按Ctrl+Z组合键退出输入模式。
5.3.2输入重定向
从标准输入录入数据时,输入的数据系统没有保存,只能使用一次,下次再想使用这些数据就得重新输入。而且在终端输入时,如果输入错误修改起来也不方便。正是因为使用标准输入很不方便,我们需要将输入从标准输入重新定个方向转到其他位置,这就是输入重定向。

Linux支持输入重定向,可以把命令的标准输入重定向到指定的文件中,也就是输入的数据不是来自键盘,而是来自一个指定的文件。也就是说,输入重定向主要用于改变一个命令的输入源,特别是那些需要大量数据输入的输入源。

在输入时,使用符号“<”和“<<”分别表示“输入”与“结束输入”。
例5.98将文档内容作为输入,如图5.138所示。

$wc</etc/passwd输入重定向,将/etc/passwd 文档内容传给wc命令。



图5.138输入重定向文件


例5.99 使用 <<结束输入,如图5.139所示。

$cat<<end从控制台输入字符串,当输入为“end”时结束输入。



图5.139从键盘输入<<结束


从图5.139中可以看到,使用符号“<<”后,输入过程与仅使用cat不同: 屏幕上显示的是键盘输入内容,直至输入end,才结束输入开始显示输出。
例5.100将标准输入保存至文件,如图5.140所示。

$cat>ss.txt<<eof从控制台输入字符串,当输入“eof”时结束输入,并把内容保存到文件ss.txt中。



图5.140标准输入并保存至文件


5.3.3输出重定向

因为输出到终端屏幕上的数据只能看,不能进行更多的处理,所以需要把输出从标准输出或标准错误输出重新定向到指定的文件,这就是输出重定向。Linux支持输出重定向,可以将输出写入指定文件,而不是在屏幕上显示。用符号“>”表示替换,符号“>>”表示追加。
输出重定向有很多应用,如保存某个命令的输出,或者某个命令的输出内容很多,不能显示在屏幕的一页内,也可以将输出重定向到一个文档内,然后用文本编辑器打开这个文档查看输出信息。输出重定向还能够把一个命令的输出作为另一个命令的输入,这就是5.4节要讲到的管道命令。
例5.101从键盘输入信息保存到文件,如图5.141所示。


$ cat>c将屏幕输入的信息保存到文件c(c初始为空文件),
按Ctrl+Z组合键退出输入。



图5.141标准输入并保存到文件c


例5.102将命令的输出保存到文件,如图5.142所示。

$ls -l>>c将命令ls的输出追加到文件c,即保存到文件的尾部,原内容不变。

$ls -l>c将命令ls的输出保存到文件c,如c不空,则覆盖原内容。



图5.142命令输出重定向到文件c



例5.103将文件内容输出到另一个文件,如图5.143所示。

$ cattmp >tmp1将文件tmp中的内容复制到文件tmp1中。



图5.143文件内容输出重定向至文件


5.4管道
管道(Pipeline): 一个由标准输入输出链接起来的进程集合,是一个连接两个进程的连接器,如图5.144所示。管道的命令操作符是“|”,它将操作符左侧命令的输出信息(STDOUT)作为操作符右侧命令的输入信息(STDIN)。可以用下面的图形示意,Command1正确输出,作为Command2的输入,然后Command2的输出作为Command3的输入,Command3输出则会直接显示在屏幕上。


图5.144管道示意图



从功能上说,管道类似于输入输出重定向,但是管道触发的是两个子进程,分别执行“|”两边的程序,而重定向执行的是一个进程。一般如果是命令间传递参数,还是管道的好,如果处理输出结果需要重定向到文件,还是用输出重定向比较好。
使用管道时需要注意以下几点。
(1) 管道是单向的,一端只能输入,另一端只能用于输出,遵循“先进先出”原则。
(2) 管道命令只处理前一个命令的正确输出,如果输出的是错误信息,则不处理。
(3) 管道操作符右侧命令,必须能够接收标准输入流命令。
管道分为普通管道和命名管道两种。这里所讲的管道是普通管道。
例5.104查找文件内容并显示、统计,如图5.145所示。

$ cata1.txt|grep"a"查找文件a1.txt中包含a的字符串并显示。

$ cata1.txt|grep"a"|wc-l查找文件a1.txt中包含a的字符串并统计行数,随后显示统计结果。



图5.145查找、统计并显示文件内容




图5.146查找、统计并显示


例5.105查找文件内容进行统计后显示,如图5.146所示。

$cat1.txt|grep"s"|wc -l统计文件1.txt中包含s的字符串行数,并显示。

$cat1.txt|grep"s"|wc -w统计文件1.txt中包含s的字符串字数,并显示。

$cat1.txt|grep"s"|wc -c统计文件1.txt中包含s的字节数,并显示。

例5.106查找命令的输出,如图5.147所示。

$ ls -l | grep '^d'通过管道过滤ls -l输出的内容,只显示以d开头的行(即只显示当前目录中的目录/子目录)。



图5.147查找ls命令的输出内容


5.5链接
5.5.1什么是链接

链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的方法。例如,当我们需要在不同的目录用到相同的文件时,不需要在每一个需要的目录下都放一个必须相同的文件,只要在某个固定的目录
下存放该文件,然后在其他的目录下链接它就可以,不必重复地占用磁盘空间。
5.5.2索引节点
要了解链接,首先得了解一个概念,即索引节点(inode)。在Linux系统中,内核为每一个新创建的文件分配一个inode(索引节点),每个文件都有一个唯一的inode号。我们可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。文件属性保存在索引节点里,在访问文件时,索引节点被复制到内存里,从而实现文件的快速访问。系统是通过索引节点(而不是文件名)来定位每一个文件的。
5.5.3两种链接
Linux中包括两种链接: 硬链接(Hard Link)和软链接(Soft Link)。软链接又称为符号链接(Symbolic Link)。
(1) 硬链接: 硬链接就是一个指针,指向文件索引节点,但系统并不为它重新分配inode,不占用实际空间。硬链接不能链接到目录和不同文件系统的文件。
ln命令用来建立硬链接。
(2) 软链接: 软链接又叫符号链接,这个文件包含另一个文件的路径名,系统会为其重新分配inode,类似于Windows中的快捷方式。软链接可以是任意文件或目录,包括不同文件系统的文件和不存在的文件名。
ln s命令用来建立软链接。
硬链接记录的是目标的inode,软链接记录的是目标的路径。软链接就像是快捷方式,而硬链接就像备份。软链接可以做跨分区的链接,而硬链接由于inode的缘故,只能在本分区中做链接,所以软链接使用更多。
5.5.4链接命令ln
功能描述: 为某一个文件在另外一个位置建立一个同步的链接。ln命令会保持每一处链接文件的同步性,也就是说,不论改动了哪一处,其他的文件都会发生相同的变化。

语法: ln[参数][源文件或目录][目标文件或目录]
选项: ln命令的常用选项如表5.38所示。


表5.38ln命令的常用选项



选项作用

s软链接(符号链接)
b删除,覆盖以前建立的链接
d允许超级用户制作目录的硬链接
f强制执行
i交互模式,文件存在则提示用户是否覆盖
n把符号链接视为一般目录
v显示详细的处理过程
S“S<字尾备份字符串>”或“suffix=<字尾备份字符串>”
V“V<备份方式>”或“versioncontrol=<备份方式>”

例5.107建立文件符号链接和硬链接,如图5.148所示。

$ ln-sx.txtxx.txt建立x.txt 文件的符号链接xx。

$ lnx.txtxxy.txt建立x.txt 文件的硬链接xxy.txt。



图5.148建立文件符号链接和硬链接


从图5.148可以看到建立符号链接的索引节点号(inode)的改变,原文件索引节点号为135672,链接文件的索引节点号为135673,属性链接数目变为2,链接文件权限的第一位用l表示。建立硬链接的索引节点号(inode)不变,仍为135672,链接数目变为2。

例5.108建立文件目录的符号链接,如图5.149所示。

$ln-ss2aa在aa目录下建立s2文件的符号链接,默认命名为s2。



图5.149在目标目录下建立符号链接



例5.109建立文件目录的硬链接,如图5.150所示。

$lns1aa在aa目录下建立文件s1的硬链接。



图5.150在目标目录下建立硬链接



例5.110建立目录的符号链接和
硬链接,将看到不允许给目录建立硬链接,如图5.151所示。



图5.151目录不能建立硬链接


尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一些不足之处。
(1) 不允许给目录创建硬链接。
(2) 不可以在不同文件系统的文件间建立硬链接。因为 inode 是这个文件在当前分区中的索引值,是相对于这个分区的,因此不能跨越文件系统了。
软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在使用更为广泛,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
硬链接和软链接的区别如下。
(1) 硬链接原文件/链接文件公用一个inode号,说明它们是同一个文件,而软链接原文件/链接文件拥有不同的inode号,表明它们是两个不同的文件。
(2) 在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系。
(3) 链接数目是不一样的,软链接的链接数目不会增加。
(4) 文件大小是不一样的,硬链接文件显示的大小是跟原文件一样的,而这里软链接显示的大小与原文件就不同。

(5) 软链接没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。

总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现它是个链接文件,它读取链接文件找到真正要访问的文件。

当然软链接也有硬链接没有的缺点: 因为链接文件包含原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了; 而硬链接就没有这个缺陷,想怎么移就怎么移。软链接要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。
习题
1. 填空题

(1) Linux 操作系统支持很多现代的流行文件系统,其中
文件系统使用最广泛。
(2) Linux系统中,没有磁盘的逻辑分区(即没有C盘、D盘等),任何一个种类的文件系统被创建后都需要到某个特定的目录才能使用,这相当于激活一个文件系统。
(3) Linux采用的是拓扑结构,最上层是根目录。
(4) 当前用户为ma,则登录后进入的主目录为。
(5) 查看文件的内容常用命令有: 、、、、。
(6) cp命令可以复制多个文件,将要复制的多个文件由分隔开。
(7) 使用touch命令,创建一个文件。
(8) rm命令只能删除文件,不能删除目录,如果删除目录必须加参数。
(9) 管道的命令就是将操作符左侧命令的输出信息作为操作符右侧命令的。
(10) 命令$cd ~是切换到。
2. 问答题
(1) Ubantu根目录下有哪些重要的目录?各存放了什么信息?
(2) Ubantu下有哪些文件类型?
(3) 使用ls l命令可以查看文件的详细属性,说明图5.152中各列信息的含义。


图5.152查看文件的详细属性

(4) 使用chmod命令设置文件权限的两种模式是什么?它们分别采用什么方法来描述权限?
(5) find命令查找文件有哪些方式?
(6) 什么是输入输出重定向?如何将命令输出保存到新文件?
(7) 什么是管道?分析其与重定向的异同。
(8) Ubuntu中两种链接方式是什么?并分析其不同。
3. 实验题
(1) 在你的用户下面,建立空文件file1、file2、file3、file4,建立目录 dir1、dir2。
(2) 建立目录dir3,其权限为442。
(3) 建立file1 文件的符号链接,自定文件名; 建立file1 文件的硬链接,自定文件名; 
用ls命令加参数显示索引节点号,比较硬链接和符号链接的不同。

(4) 在目录下建立链接: 建立源文件为file2,目标为dir1目录的符号链接,自定文件名; 建立源文件为file2,目标为dir1目录的硬链接,自定文件名。

(5) 跨目录建立链接: 建立源文件为file2,目标为/home目录的符号链接,自定文件名
; 建立源文件为file2,目标为/home目录的硬链接,自定文件名,是否可以?

(6) 把file3文件复制到dir1目录下。
(7) 用 tar 压缩 dir1目录,自定名字; 用gzip压缩dir1目录,比较不同点。
(8) 把file4文件移动到dir2目录下。

(9) 更改组和所有者: 更改dir2目录和目录中的文件的组和所有者为你登录的用户名。
(10) 改变文件和目录的权限: 用符号模式更改dir2目录和目录中的文件权限为所有
者具有全权,同组人具有读和写的权限,其他人只有执行的权限。
(11) 改变文件和目录的权限: 用绝对模式更改dir1目录和目录中的文件权限为421。
(12) 查找文件: 查找根目录下所有以“.conf”为扩展名的文件。
(13) 查找根目录及其子目录下所有最近20天内访问过的文件。
(14) 在dir1目录下查找小于10B的文件。
(15) 查找文件内容: 在自己的目录下查找以f开头的文件名,并在这些文件中搜索包含“is”的行。
(16) 删除dir1、dir2、dir3 目录。