第五章 Ubuntu 文件管理
1.填空题
**(1)** Linux操作系统支持很多现代的流行文件系统,其中 Ext2、Ext3、Ext4 文件系统使用最广泛。
Ext2 | 常见文件系统特点 1.可根据实际情况自行选择最佳块大小,避免产生过多内部碎片,减轻系统开销; 2.预先选择该给分区分配的索引节点,有效利用磁盘空间 3.磁盘块分组,提高文件访问效率 4.预留相邻的块,以减少当文件大小增加时产生的碎片 5.支持快速符号链接 详细解释如下: Debian、Red Hat Linux等Linux发行版的默认文件系统; 可根据预期文件平均长度选择最佳块大小,可减轻系统开销,也可减少小文件可能产生的内部碎片; 可根据给定大小的分区预计存放的文件数,去选择该分配的索引节点数,以有效利用磁盘空间; 将磁盘块分组,组内存放在相邻磁道上的数据块和索引节点,可用较少的寻道时间并行访问单独块组中的文件; 磁盘数据块预分配给普通文件,当文件大小增加时,物理上的几个相邻块已被保留,从而减少文件碎片的产生; 支持快速符号链接,当符号链接表示一个短路径名,可将其存放在索引节点中而不通过一个数据块进行装换; 单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关 |
Ext3 | 1.高可用性 2.数据的完整性 3.文件系统的速度 4.数据转换 5.多种日志模式 详细解释如下: 在Ext2的基础上增加了日志; 高可用性。非正常关机后,系统无需检查文件系统,宕机后,恢复文件系统只需数十秒; 数据的完整性。有一种模式是——同时保持文件系统及数据的一致性模式,该模式下用户不会看到因非正常关机而存储在磁盘上的垃圾文件; 文件系统的速度。虽然存储数据时可能要写多次,但其日志功能对磁盘的驱动器读写头进行了优化,总体读写性能并未降低; 数据转换。提供tune2fs工具可将Ext2转换为Ext3,Ext3可直接加载成为Ext2; 多种日志模式。一是data=journal模式,即对所有的文件数据及metadata(定义文件系统中数据的数据,即元数据)进行日志记录。二是data=ordered/data=writeback模式,即只对metadata记录日志,而不对数据进行日志记录。 |
Ext4 | 1.更大的文件系统和更大的文件 2.更多的子目录数量 3.更多的块和i-节点数量 4.多块分配 5.持久性预分配 6.延迟分配 7.盘区结构 8.新的i-节点结构 9.日志校验功能 10.支持“无日志”模式 11.默认启用Barrier 12.在线碎片整理 13.支持快速fsck 14.支持纳秒级时间戳 详细解释如下: 目前的大部分Linux文件系统都默认采用Ext4文件系统; 支持大文件系统、提高了对碎片的抵抗力、有更高的性能以及更好的时间戳; 为更好的说明Ext4文件系统的显著特点及相较其与Ext3文件系统的不同之处,故而再分列如下表格进行比较说明 |
Ext3 | Ext4 | |
更大的文件系统和更大的文件 | 最多支持32TB文件系统和2TB文件,而实际只有2TB文件系统和16GB文件 | 1EB文件系统和16TB文件 |
更多的子目录数量 | 最多支持32000个子目录 | 理论上支持无限数量 |
更多的块和i-节点数量 | 用32位空间记录块数量和i-节点数量 | 扩充到64位 |
多块分配 | 数据写入时,数据块分配器每次只能分配一个4KB的块 | 有多块分配器可实现一次调用分配多个数据块 |
持久性预分配 |
| 实现持久性预分配并提供相应的API,效率更高 |
延迟分配 | 数据块分配策略是尽快分配 | 数据块分配策略是尽可能延迟分配,直到文件在缓存中写完才开始分配数据块并写入磁盘,从而优化整个文件的数据块分配,显著提升性能 |
盘区结构 | 间接映射地址,当操作大文件时,效率极低 | 引入盘区(一组连续的数据块)保存数据文件,提高访问效率 |
新的i-节点结构 | 默认i-节点大小为128B | 默认i-节点大小为256B。还支持快速扩展属性和i-节点保留 |
日志校验功能 |
| 将Ext3的两阶段日志机制合并成一个阶段,增加安全性并提高性能 |
支持“无日志”模式 |
| 必要时允许关闭日志以提升性能 |
默认启用Barrier |
| 只有当Barrier之前的数据全部写入磁盘,才能写Barrier之后的数据 |
在线碎片整理 |
| 提供e4defrag工具进行个别文件或整个文件系统的碎片整理 |
支持快速fsck | 以前的文件系统版本执行fsck时很慢,因为要检查所有的i-节点 | 给每个块组的i-节点表中都添加了一份未使用i-节点的列表,其做一致性检查时就可跳过它们而只去检查那些在使用的i-节点,从而提高速度 |
支持纳秒级时间戳 | Ext4之前的文件系统时间戳都是以秒为单位 | 时间戳单位提升到纳秒 |
**(2)** Linux系统中,没有磁盘的逻辑分区(即没有C盘,D盘等),任何一个种类的文件系统被创建后都需要 挂载 到某个特定的目录才能使用,这相当于激活一个文件系统。
Linux用mount对文件系统进行挂载(挂载文件系统时需要明确挂载点),用umount对文件系统进行卸载;
Windows将磁盘分为若干个逻辑分区,如C盘、D盘,在各个分区中挂载文件系统,该过程用其内部机制完成,用户无法探知。
**(3)** Linux采用的是 树形 拓扑结构,最上层是根目录。
DOS和Windows也采用树形结构,但它们的树形结构的根是磁盘分区的盘符,有几个分区就有几个树形结构,之间属于并列关系。
Linux中,无论操作系统管理几个磁盘分区,目录树只有一个,各个磁盘分区上的树形目录不一定并列。
**(4)** 当前用户为ma,则登录后进入的主目录为 /home/ma 。
登录用户的主目录放在/home目录下,以用户的名称作为/home目录下各个子目录的名称。
**(5)** 查看文件的内容常用命令有: cat 、 more 、 less 、 head 、 tail 。
cat | 功能: 串接文件或显示文件内容; 可从标准输入设备读取数据并将其结果重定向到已有文件(该文件若不是空的,则原来的内容会被覆盖,可采用追加重定向的方式,避免此种情况的发生)或一个新的文件中(该文件原来不存在,此处可实现新建文件并同时添加文件内容的目的); “>”表示输出重定向,可将现有的一个或多个文件内容重定向到已有文件,若目标文件不存在,则建立新的; “>>”表示追加重定向,可将现有的一个或多个文件内容追加重定向到已有文件的尾部,若目标文件不存在,则建立新的; 参数: -n/-number(由1开始对所有输出的行号编号) -b(和-n相似,只不过对于空白行不编号) -s(当遇到有连续两行以上的空白行时,就代换为一行空白行) -E(--show-ends,在每行结束处显示$) Ctrl+D退出当前的输入状态(也可以是Ctrl+C退出,不同版本机器可能会有不同的情况) 其中, cat > file = cat -> file; 若是设置结束标志,则格式为cat > file << EOF,此处的结束标志是指当输入设定的标志时,结束输入,即相当于Ctrl+D或Ctrl+C或其他等的作用 |
more | 功能: 显示输出的内容,根据窗口的大小进行分页显示,在终端底部打印出现“--More--”及已显示文本占全部文本的百分比 参数: -f或<空格>(显示下一页) <回车>(显示下一行) -q 或-Q(退出more) +num(从第num行开始显示) –num(定义屏幕大小为num行) +/pattern(从文件中的第一个pattern前两行开始显示) –c(从顶部清屏然后开始显示) –d(提示按空格键继续,按Q键退出,禁止响铃功能) –l(忽略换页(Ctrl+l)字符) –p(通过清除窗口而不是滚屏来对文件进行换页) –s(把连续的多个空行显示为一行) –u(把文件内容中的下划线去掉) 按Enter键显示下一行 按f键或空格键显示下一页 按Ctrl+B键返回上一屏 按q键退出显示 其中,more -dc file(显示提示,并从终端或控制台顶部显示) |
less | 功能: 显示输出的内容,根据窗口的大小进行分页显示 参数: -m(显示读取文件的百分比) -M(显示读取文件的百分比、行号及总行数) -N(在每行前输出行号) -s(把连续多个空白行作为一个空白行显示) -c(从上到下刷新屏幕,并显示文件内容) -f(强制打开文件,禁止文件显示时不提示警告) -i(搜索时忽略大小写,除非搜索串中包含大写字母) –I(搜索时忽略大小写,除非搜索串中包含小写字母) -p(搜索pattern) -Q(在终端下不响铃) |
head | 功能: 显示文件的前n行/段 参数: -n(显示文件的前n行,系统默认值是10,即不加参数时的默认显示) -c(显示文件的前n个字节) 其中, head -2 file=head -n 2 file |
tail | 功能: 显示文件的最后n行 参数: -n(显示文件的最后n行,系统默认值是10) -f(不断读取显示文件的最新内容,并且不断刷新,以达到实时监控的目的,按Ctrl+Z可退出) 其中, tail -3 file=tail -n 3 file |
**(6)** cp命令可以复制多个文件,将要复制的多个文件由 空格 分隔开。
cp可将一个或多个文件或目录复制到另一个文件或目录中,此处要注意的是,目标目录只一个且还要是已经存在的,否则会出现错误。
**(7)** 使用touch命令,创建一个 空 文件。
执行该命令后,文件的创建时间或修改时间会更新为当前系统的时间,如文件不存在,则自动新增一个或多个空文件。(要创建的多个空文件名之间用空格作分隔)
-d | 以yyyymmdd的形式给出要修改的时间,而非现在的时间 如,touch -d "2022-02-22 22:22:22" file 另外,可使用ls --full-time file查看指定文件(此处为file)的当前的详细时间等信息 |
-a | 只更改存取时间 |
-c | 不建立任何文档 |
-f | 此参数将忽略不予处理,仅负责解决BSD版本指令的兼容性问题 |
-m | 只更改变动时间 |
-r | 把指定文档或目录的日期时间设成参考文档或目录的日期时间 如,touch -r file1 file2(file2的时间更改为和file1一样) |
**(8)** rm命令只能删除文件,不能删除目录,如果删除目录必须加参数 -r 。
-f | 强制删除。忽略不存在的文件,不提示确认 |
-i | 在删除前会有提示,需要确认。即当删除子目录前会逐个进行确认 |
-I(即大写的i) | 在删除超过三个文件时或者在递归删除前需要确认。即删除子目录前只总的进行一次性的确认 |
-r(R) | 递归删除目录及其内容(无该选项时只删除文件) |
**(9)** 管道的命令就是将操作符左侧命令的输出信息作为操作符右侧命令的 输入信息 。
**(10)** 命令$cd ~是切换到 用户主目录 。
直接输cd,也可回到主目录;
另外,输入cd ..或cd ../ 可返回上一级目录;输入cd ../..可返回上两级目录;cd /是进入根目录。
2.问答题
**(1)** Ubuntu根目录下有哪些重要的目录?各存放了什么信息?
/etc | 存放许多系统所需的重要配置与管理文件 /etc/network/interfaces存放配置修改网络接口的IP地址、子网掩码、网关的文件 /etc/resolv.conf存放指定DNS服务器的文件等 |
/dev | 存放装置文件。包含所有在系统中使用的外部设备,每个设备在其下均有一个相应的项目,此处要注意存放的并非设备驱动程序,而是一个访问这些外部设备的端口。 (其下还有一些项目是没有的装置,通常是在安装系统时所建立,不一定对应到实体的硬件装置,一些虚拟的装置也不对应到任何实体。如,空设备/dev/null,任何写入该设备的请求均会被执行、但被写入的资料均会如进入空设备般消失) |
/boot | 存放与系统激活相关的文件,是系统启动时用到的程序,不可轻易删除 initrd.img系统激活时最先加载的文件 vmlinuz为Kernel的镜像文件 System.map包括Kernel的功能及位置 |
/home | 存放登录用户的主目录,以用户的名称作为该目录下各个子目录的名称 |
/lib | 存放许多系统激活时所需要的重要的共享函数库 一般,.so为共享库,用于动态连接;.a为静态库,用于静态连接 |
/usr/lib | 存放一些应用程序的共享数据库 |
/lost+found | 用标准的 ext2/ext3/ext4 文件系统格式化过的分区都会有,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下,意外后找回的文件一般在这里面。但若是 xfs 文件系统,就不会存在这个目录 |
/mnt | 一般情况下是空的,是系统默认的挂载点,可临时将别的文件系统挂在该目录下,不过需要在其下建立任一目录作为挂载目录 |
/opt | 主要存放那些可选的程序。安装到该目录下的程序,它所有的数据、库文件等都是放在同一目录下 |
/proc | 虚拟文件系统,不占用磁盘空间,其下文件均放置于内存中。 (会记录系统正在运行的进程,硬件状态、内存使用的多少等信息,这些信息在内存中由系统自己产生) |
/root | 系统管理用户root的主目录 |
/bin | 存放一些系统启动时所需要的普通程序和系统程序,及一些经常被其他程序调用的程序、存放常用的外部命令 |
/sbin | 类似/bin,也用于存储二进制文件。因为其中的大部分文件多是系统管理员使用的基本的系统程序,故而普通用户在必要且允许时可以使用,但一般不给普通用户使用 |
/tmp | 存放系统启动时产生的临时文件,暂存有些应用程序执行中产生的临时文件 |
/var | 存放被系统修改过的数据 /var/log存放记录文件信息 /var/spool存放新闻邮件信息 /var/run存放运行时信息 |
/usr | 存放系统软件相关的数据 |
/srv | 一些网络服务启动后,这些服务所需取用的数据目录 常见的服务例如WWW, FTP 等 |
/media | 存放的是可移除的装置 包括软盘、光盘、DVD 等装置都暂时挂载于此 |
/sys | 类似于/proc ,也是一个虚拟的文件系统,主要也是记录核心与系统硬件信息相关的信息。 包括目前已加载的核心模块与核心侦测到的硬件装置信息等。该目录同样不占硬盘容量 |
**(2)** Ubuntu下有哪些文件类型?
说明:下述表格第二列中每项最前面“ ”中的内容是对应文件的属性表示,也就是说,当使用ls -l命令时,可看到的相应文件类型的属性表示。
普通文件 | 属性表示为“-”。用户通常访问的文件 |
纯文本文件 | 文本文件:普通文件中一些内容可以直接读取的文件; 二进制文件:为系统准备的,可执行的文件,如cat; 数据文件:为运行中的程序准备的,如用户登录时,记录登陆信息的/var/log/wtmp文件 |
目录文件 | 属性表示为“d”。即目录,相当于Windows中的文件夹 |
链接文件 | linux中两种链接方式:符号链接和硬链接 其中,符号链接相当于Windows中的快捷方式,属性表示为“l” |
设备文件 | Linux系统为外部设备提供一种标准接口,将外部设备视为一种特殊的文件,即设备文件 分为字符设备文件(属性表示为“c”,设备发送和接收数据以字符的形式进行)、块设备文件(属性表示为“b”,以整个数据缓存区的形式进行) |
套接字文件 | 属性表示为“s”。通常用于网络数据连接 |
管道文件 | 属性表示为“p”。用于解决多个程序同时访问一个文件造成的错误。 一般存放在/dev目录下 一般权限是:所属者有读写权限,所属组与其他用户只有读权限 |
**(3)** 使用ls -l命令可以查看文件的详细属性,说明图5.152中各列信息的含义。(图见教材)
-rw-rw-r-- | 1 | malimei | malimei | 0 | 8月 | 20 | 2020 | dd |
-rw-r--r-- | 1 | malimei | malimei | 8980 | 7月 | 19 | 2019 | example.desktop |
lrwxrwxrwx | 1 | malimei | malimie | 1 | 12月 | 17 | 16:38 | rss -> a |
drwxrwxrwx | 2 | malimei | malimei | 4096 | 12月 | 10 | 16:21 | share |
drwxrwxr-x | 2 | malimie | malimei | 4096 | 5月 | 13 | 16:25 | ss |
上表是简单列出的教材中图的各部分内容,而下表是对图中各列内容含义的详细说明。
第1列 | 该列第一项表示是文件还是目录 其中,-表示是普通文件;l表示是链接文件;d表示是目录; 另外,c表示是字符设备文件;b表示是块设备文件;s表示是套接字文件;p表示是管道文件。 该列其余项表示是文件或目录所拥有的权限,共分三组,组内又分三项,即剩余9项中,前三项表示文件或目录的所有者用户所拥有的权限,中间三项表示与文件或目录的所属组同组的用户的权限,后三项表示系统中其他普通用户对文件或目录拥有的权限; 另外,r表示是读权限;w表示是写权限;x表示是执行权限。 注,该列中除第一项之外,其余项中若有“-”,则表示对应部分的用户没有某项权限。 |
第2列 | 如果是目录,则表示该目录下的子目录和文件的数目 如果是文件,则表示是文件数或文件的链接数 |
第3列 | 表示文件的所有者名字,即属主 |
第4列 | 表示文件的所属组名字,即属组 |
第5列 | 表示文件的字节数 |
第6-8列 | 表示上一次修改的时间 |
第9列 | 表示文件名 |
**(4)** 使用chmod命令设置文件权限的两种模式是什么?它们分别采用什么方法来描述权限?
chmod命令功能:改变文件或目录的访问权限。
(只有文件或目录的所有者才有权限修改其权限,超级用户可对所有文件或目录进行权限设置)
访问文件的用户有三种类型:文件所有者、组成员用户、普通用户。
chmod命令的两种模式:符号模式、绝对模式
-v | 运行时显示详细的处理信息 |
-c | 显示改变部分的命令执行过程 |
-f | 不显示错误信息 |
-R | 将指定目录下的所有文件和子目录做递归处理 |
-reference=<目录或者文件> | 设置成与指定目录或者文件具有相同的权限 |
符号模式:
chmod [选项] [who] operator [permission] files
-a | 所有用户均具有的权限 |
-o | 除了目录或者文件的当前用户或群组以外的用户或者群组 |
-u | 文件或目录的当前所有者 |
-g | 文件或目录的当前群组 |
+ | 增加权限 |
- | 取消权限 |
= | 设定权限 |
r | 读权限 |
w | 写权限 |
x | 执行权限 |
在符号模式下,可以使用“,”来连接 多个选项,为所有者、所属群和其他用户分别设置不同的权限。
例如:$sudo chmod ug+x,o-w file(给文件所有者和同组用户增加对文件file的可执行权限,取消系统中其他普通用户对文件file的可写权限)
绝对模式:
chmod [选项] mode files
其中,mode表示权限等级,由三个八进制数表示。这三位数中,第一位表示所有者的权限,第二位表示组用户的权限,第三位表示其他用户的权限。而这三种用户中的每一种用户的权限又是由三个数的和组成,这三个数的含义分别是,4表示可读权限,2表示可写权限,1表示可执行权限。
例如:$sudo chmod 712 file1(设置文件file1的权限为文件所有者有可读、可写、可执行的权限;同组用户只有可执行的权限;系统中其他普通用户只有可写的权限)
**(5)** find命令查找文件有哪些方式?
find命令功能:寻找文件或目录的位置。可以按照文件名、类型、所有者甚至最后更新的时间来搜索文件。可利用时间特征来查找文件。
-type | 查找某一类型的文件,具体参数见后面说明 |
-name | 按照文件名查找文件 |
-group | 按照文件所属的组来查找文件 |
-user | 按照文件所有者来查找文件 |
find命令将匹配的文件输出到标准输出 | |
-link | 按照文件的链接数来查找文件 |
-size n : [c] | 查找文件长度为n块的文件,带有c时表示文件长度以字节计 |
-newer file1 ! file2 | 查找更改时间比文件file1新,但比文件file2旧的文件 |
-perm | 按照文件权限来查找文件 |
-depth | 在查找文件时,首先查找当前目录中的文件,然后在其子目录中查找 |
-prune | 不在指定的目录中查找,如同时使用-depth选项,-prune将被忽略 |
-nogroup | 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在 |
-nouser | 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在 |
b | 块设备文件 |
d | 目录 |
c | 字符设备文件 |
p | 管道文件 |
l | 符号链接文件 |
f | 普通文件 |
amin n | 查找n分钟以内被访问过的所有文件 |
atime n | 查找n天以内被访问过的所有文件 |
cmin n | 查找n分钟以内文件状态被修改过的所有文件 |
ctime n | 查找n天以内文件状态被修改过的所有文件 |
mmin n | 查找n分钟以内文件内容被修改过的所有文件 |
mtime n | 查找n天以内文件内容被修改过的所有文件 |
上述时间特征参数的区分:min指分钟;time指天数。
a指被访问过;c指文件状态被修改过;m指文件内容被修改过。
find命令的具体用法:
1)通过文件名查找(知道某个文件名,却不知道其所在的目录)
#find / -name httpd.config -print
解释:/是指根目录;-name和-print都是find命令参数,含义可查询上面的表格;httpd.config是已知的文件名。
$find ~ -name "*.doc" -print(查找当前目录及其子目录中扩展名为.doc的文件并显示)
其中,~是指登录用户的主目录
$find . -name "[A-F]*" -print(查找以大写字母A~F开头的文件并显示)
$find /etc -iname 'f????'(查找/etc下所有以f开头后面有四个字符的文件)
2)根据部分文件名查找(不知道文件全名,只依稀记得名字中的几个字母)
#find / -name *httpd* -print
解释:/是指根目录;-name和-print都是find命令参数,含义可查询上面的表格;*是通配符,其他通配符有?;此处要查找的文件是httpd.config,不过当只记得httpd,即部分文件名时,使用统配符进行模糊查询,同样可以找到想查找的文件。
3)根据文件的特征查询(仅只某文件大小、修改日期等特征)
3.1)按照文件长度查找
#find /etc -size -2500c -print
解释:/etc是根目录下的一个目录;-print是find命令参数,含义可查询上面的表格;特别要说的是“-size -2500c”也是find命令参数,上表中也有相关含义,其中,c是以字节计文件长度,此处要查找的文件长度为2500B,要注意此部分的具体书写格式和用法。
$find -size +1000000c -print(在当前目录下查找文件长度大于1MB的文件)
3.2)按照文件权限模式查找
$find . -perm 777 -print(在当前目录下查找文件权限为777的文件,即查找每个人都有可读可写可执行权限的文件)
3.3)忽略某个子目录查找
$find work -path "cc/d1" -prune -o -print(查找cc文件夹及子文件夹的文件,忽略子文件夹d1)
3.4)按文件所有者、用户组等查找
$find work -user malimei -print(在work文件夹下查找所有者为malimei的文件并输出)
$find /home/malimei/Documents -group malimei -print(在Documents文件夹下查找属于malimei用户组的文件)
3.5)按照时间查找
$find /home/malimei/Documents/work -mtime -5 -print(查找更改时间在5日内的/home/malimei/Documents/work文件)
3.6)按照文件类型查找
$find /home/malimei/Documents -type d -print(查找指定目录下所有的目录文件并显示)
**(6)** 什么是输入输出重定向?如何将命令输出保存到新文件?
输入重定向:从标准输入录入数据时,输入的数据系统没有保存,只能使用一次,若下次再想使用这些数据就得重新输入。且在终端输入时,若输入错误修改很不方便,故需要一种方式将输入从标准输入重新定个方向转到其他位置,此即输入重定向。
输入重定向主要用于改变一个命令的输入源,特别是那些需要大量数据输入的数据源。
在输入时,“<”表示输入;“<<”表示结束输入。
其中,对于“<<”,输入过程与仅使用cat不同:屏幕上显示的是键盘输入内容,直至输入end(即结束输入的标记),才结束输入开始显示输出。
输出重定向:因为输出到终端屏幕上的数据只能看,不能进行更多的处理,所以需要把输出从标准输出或标准错误输出重新定向到指定的文件,此即输出重定向。
在输出时,“>”表示替换;“>>”表示追加。
输出重定向的应用:
1)保存某个命令的输出,若某个命令的输出内容很多,不能显示在屏幕的一页内,也可输出重定向到一个文档内,然后用文本编辑器打开该文档查看输出信息。
2)能把一个命令的输出作为另一个命令的输入,这就有点类似于管道了,二者的区别在本篇文章问答题第(7)小题中已有说明,此处不再赘述。
将命令输出保存到新文件:
command > file(将输出重定向到 file,此会覆盖原文件file中的内容)
command >> file1(将输出以追加的方式重定向到 file1,此只将再输入的内容追加到原文件file1尾部,原文件不会被覆盖)
command部分最常用的命令是cat。
扩展:
对于使用cat命令配合实现文件内容的重定向和追加重定向,在本篇文章填空题中第(5)小题部分已有大致说明,故此处不再赘述,下面对Linux中Shell 输入/输出重定向进行较为深入的说明。
command > file | 将输出重定向到 file |
command < file | 将输入重定向到 file |
command >> file | 将输出以追加的方式重定向到 file |
n > file | 将文件描述符为 n 的文件重定向到 file |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file |
n >& m | 将输出文件 m 和 n 合并 |
n <& m | 将输入文件 m 和 n 合并 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入 |
其中要注意,文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
输出重定向(>):
重定向一般通过在命令之间插入特定的符号来实现,如command > file,即执行command后将输出的内容存入file,若file不是空的且当想要再添加内容时原内容不被覆盖丢失,则使用“>>”即可。
不过,像有些command执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。这时,可使用 cat 命令自行手动查看文件内容。
如,执行$ who > users后终端就不会显示输出信息,用$ cat users可查看users文件内容。
输入重定向(<):
可以实现从文件获取输入,如command1 < file1,这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
如,以统计 users 文件的行数(2行)为例:执行$ wc -l users ,输出显示 2 users。会输出文件名
以将输入重定向到 users 文件为例:执行$ wc -l < users,输出显示2。不会输出文件名,因为
它仅仅知道从标准输入读取内容
另外,执行command < infile > outfile,可实现同时替换输入和输出,执行command,从文件infile中读取内容,然后将输出写入到outfile中。即将 stdin 重定向到 infile,将 stdout 重定向到 outfile。
重定向深入说明:
一般情况下,每个Linux 命令运行时都会打开三个文件:
标准输入文件(stdin):文件描述符为0,程序默认从stdin读取数据。
标准输出文件(stdout):文件描述符为1,程序默认向stdout输出数据。
标准错误文件(stderr):文件描述符为2,程序会向stderr流中写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
而$ command 2>file是将stderr 重定向到 file;$ command 2>>file是将 stderr 追加重定向到 file 文件末尾。
$ command > file 2>&1是将stdout 和 stderr 合并后重定向到 file;$ command >> file 2>&1是将stdout 和 stderr 合并后追加重定向到 file文件末尾。
Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。如,
command << delimiter
document
delimiter
是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
注意:结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进;开始的delimiter前后的空格会被忽略掉。
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,则可将输出重定向到 /dev/null,如
$ command > /dev/null
(/dev/null 是一个特殊的文件,写入其中的内容都会被丢弃,即便尝试从该文件读取内容,也读不出什么。但是 /dev/null 文件也有它独特的用处,将命令的输出重定向到它,会起到"禁止输出"的效果)
而执行$ command > /dev/null 2>&1,将会屏蔽 stdout 和 stderr。
**(7)** 什么是管道?分析其与重定向的异同。
管道:一个由标准输入输出链接起来的进程集合,是一个连接两个进程的连接器。管道的命令操作符是“|”。分为普通管道和命名管道。
注意:管道是单向的,只能一端输入,另一端输出,是先进先出的;
管道命令只处理前一个命令的正确输出,若输出的是错误信息,则不予处理;
管道操作符右侧命令,必须能够接收标准输入流命令。
管道与重定向的异同:
从功能上来说,管道类似于输入输出重定向,但是管道触发的是两个子进程,分别执行“|”两边的程序,而重定向执行的是一个进程。
一般,若是命令间传递参数,建议用管道;若是处理输出结果需要重定向到文件,建议用输出重定向。
**(8)** Ubuntu中两种链接方式是什么?并分析其不同。
索引节点(inode):Linux系统中内核为每一个新创建的文件分配一个inode(索引节点),每一个文件都有一个唯一的inode号,其永远指向对应文件的具体存储位置。
Linux中两种链接方式:硬链接、软链接(符号链接)
硬链接:相当于一个指针,指向文件的索引节点。建立硬链接用ln命令。
软链接:又叫符号链接,该文件包含另一个文件的路径名。建立软链接用ln -s命令。
ln命令功能:为某一个文件在另外一个位置建立一个同步的链接,ln会保持每一处链接文件的同步性。
-s | 软链接(符号链接) |
-b | 删除,覆盖以前建立的链接 |
-d | 允许超级用户制作目录的硬链接 |
-f | 强制执行 |
-i | 交互模式,文件存在则提示用户是否覆盖 |
-n | 把符号链接视为一般目录 |
-v | 显示详细的处理过程 |
-S | “-S<字尾备份字符串>”或“--suffix=<字尾备份字符串>” |
-V | “-V<备份方式>”或“--version-control=<备份方式>” |
例如:
$ln -s x.txt xx.txt(建立x.txt文件的符号链接xx.txt)
$ln x.txt xxy.txt(建立x.txt文件的硬链接xxy.txt)
$ln -s s2 aa(在aa目录下建立s2文件的符号链接,默认命名为s2)
$ln s1 aa(在aa目录下建立s1文件的硬链接)
硬链接和软链接的不同之处如下表:
硬链接 | 软链接 |
记录的是目标的inode | 记录的是目标的路径 |
就像备份 | 就像Windows中的快捷方式 |
不可以在不同文件系统的文件间建立硬链接 (因为inode是这个文件在当前分区中的索引值,是相对于这个分区的,因此只能在本分区中做链接,不能跨越文件系统) 不允许给目录创建硬链接 | 没有任何文件系统的限制 软链接可以跨越不同机器,不同网络,不同分区对文件进行链接 任何用户都可以创建指向目录的软链接 可以链接任意文件或目录,包括不同文件系统的文件和不存在的文件名 |
节省空间 (因为系统并不为其重新分配inode,不占用实际空间) | 系统会为其重新分配inode 需要系统分配额外的空间用于建立新的索引节点和保存原文件的路径 |
原文件/链接文件公用一个inode号,说明它们是同一个文件 | 原文件/链接文件拥有不同的inode号,说明它们是两个不同的文件 |
在文件属性上没有写出来 (因为本质上硬链接文件和原文件是完全平等关系) | 在文件属性上明确写出了是链接文件 |
链接数目不会增加 | |
文件显示的大小跟原文件一样 | 文件显示的大小跟原文件不同 |
没有右边所述的限制,怎么移动都可以 | 因为链接文件包含原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了 |
3.实验题
(略)
更多推荐
Ubuntu Linux 操作系统与实验教程(第2版)微课视频版 习题答案(五)
发布评论