第3章 文件管理与vim编辑器      在第2章中,我们初步了解了openEuler文件管理的一些基础知识。在这一章中,我们将深入学习openEuler操作系统中的文件管理。此外,本章还将介绍vim编辑器,vim的使用将贯穿本书服务器配置部分的内容,学会使用vim对系统管理员而言至关重要。 3.1 文件管理 3.1.1 文件类型   openEuler整个文件系统是一个树形结构,其所有的文件都位于树中,整棵树只有一个根,即根目录(/)。这里所讲的文件是一个宽泛的概念,在系统中可以理解为“一切皆文件”,也就是说普通文件、普通目录、硬件设备、程序进程、通信通道,甚至是内核的数据结构等都可以被理解成文件。总体来讲,这些都可以理解成文件,但是这些文件又被分成了不同的类型。   1.?普通文件   普通文件指的是一般意义上理解的文件,如文本文件、图片文件、MP4视频文件等。在系统中,每个文件都有自己的属性,通过属性可以判断文件的类型。使用 ls -l命令可以查看某个文件的属性,例如下面是查看文件anaconda-ks.cfg的属性的命令,该文件存放在/root目录下,命令如下: [root@server ~]# ls -l /root/anaconda-ks.cfg -rw-------. 1 root root 1072 1月 17 06:01 /root/anaconda-ks.cfg   通过ls命令可以查看文件属性,如果属性的第1个符号是“-”,则表示该文件是普通文件。普通文件一般用于存放数据内容,如文本、图像、音乐等。   2.?目录文件   目录文件是表示目录的文件,也可以理解成文件夹,在目录下可以有其他文件。通过ls -l命令输出的目录文件的属性的第1个符号是d。例如,查看chen目录的属性的命令如下: [chen@server ~]$ ls -ld /home/chen drwx------. 20 chen chen 4096 5月 25 17:29 /home/chen   为何需要目录文件?系统中的文件种类繁多,数量庞大,为了使用户方便地管理所有文件,系统需要一个良好的树形目录结构,一个目录就相当于一棵树杈,也相当于一个容器,其下又可以包含文件或目录,这样通过分级对文件进行管理。   3.?设备文件   设备文件是用于代表设备的文件,在系统中,所有的设备都被抽象成了文件,并显示在/dev目录下,这些设备文件根据读写的粒度,又可分为块设备文件和字符设备文件。   1)块设备文件   块设备的主要特点是可以随机读写,如最常见的块设备是磁盘。块设备文件的文件属性的第1个符号是b。例如,查看/dev/sda1块设备文件的属性,命令如下: [chen@server ~]$ ls -l /dev/sda1 brw-rw----. 1 root disk 8, 1 1月 17 05:23 /dev/sda1   2)字符设备文件   字符设备的主要特点是按顺序读写,如最常见的字符设备文件打印机和终端,它们可以接收字符流。字符设备文件的文件属性的第1个符号是c。例如,查看/dev/tty5字符设备文件的属性,命令如下: [chen@server ~]$ ls -l /dev/tty5 crw--w----. 1 root tty 4, 5 1月 17 05:23 /dev/tty5   另外,系统中还存在一个特殊的字符设备文件/dev/null,可以理解成空设备,输出到该设备上的所有内容都会被自动丢弃。   4. 管道文件   管道文件也可以叫作FIFO文件,FIFO是First In First Out的缩写。管道文件就是从一端流入,从另一端流出的文件,类似管道。管道文件的文件属性的第1个符号是p。例如,查看1.ref管道文件的属性,命令如下: [chen@server ~]$ ls -l /run/systemd/inhibit/1.ref prw-------. 1 root root 0 1月 17 05:23 /run/systemd/inhibit/1.ref   5. 链接文件   链接文件有两种类型:软链接文件和硬链接文件。   1)软链接文件   软链接文件又叫符号链接文件,这个文件包含了另一个文件的路径名。软链接文件类似Windows系统中的快捷方式。在对软链接文件进行读写操作时,系统实际是对源文件进行操作,但是在删除软链接文件时,系统仅仅删除软链接文件,而不删除源文件。软链接文件的文件属性的第1个符号是“l”,命令如下: [chen@server ~]$ ls -l /bin lrwxrwxrwx. 1 root root 7 3月 30 2021 /bin -> usr/bin   2)硬链接文件   硬链接文件是已存在的一个文件的一个备份。对硬链接文件进行读写和删除操作时,结果和软链接相同,但是如果删除硬链接文件的源文件,则硬链接文件仍然存在,而且保留了原有内容,特别需要注意的是,这时系统认为它是一个普通文件,而不记得它曾是一个硬链接文件。 3.1.2 目录的创建与删除   1.?创建目录   创建目录是系统管理中常见的操作,使用mkdir命令可以在系统中创建空目录,mkdir可以理解成英文make directory的缩写,系统中的命令一般是一些英文单词或词组的缩写,了解其含义有助于学习者记忆。   mkdir命令语法格式: mkdir [选项] [目录]   mkdir命令的常用选项及含义见表3-1。 表3-1?mkdir命令的常用选项及含义 选??项 含??义 -m <权限> 对新创建的目录设置权限,类似chmod,而不是a=rwx减umask -v 每次创建新目录都显示信息 -p 需要时创建目标目录的上层目录,但即使这些目录已存在也不当作错误处理   下面通过一些示例说明mkdir命令的应用。   【例3-1】 使用mkdir命令在当前用户的家目录下创建如图3-1所示的目录结构。 图3-1?本题中要创建的目录结构示意图   (1)mkdir命令可以一次建立一个或多个目录。如在用户chen的家目录下建立mydocs和mypics两个目录,命令如下: [chen@server ~]$ mkdir mydocs mypics //一次创建了两个目录。这两个目录使用的是相对路径写法   或者执行如下命令: [chen@server ~]$ mkdir /home/chen/mydocs /home/chen/mypics //一次创建了两个目录。这两个目录使用的是绝对路径写法   这里,以上两个命令是等价的,第1个命令默认为在当前目录上创建,第2个命令采用到了绝对路径。   用户chen在使用mkdir创建目录时,默认目录的权限是775,因此,mypics和mydocs目录的权限都是775,可以通过如下命令查看文件的属性。 [chen@server ~]$ ll -d mydocs mypics drwxrwxr-x. 3 chen chen 4.0K 5月 22 08:06 mydocs drwxrwxr-x. 2 chen chen 4.0K 5月 22 07:56 mypics   (2)创建目录Cprogram,命令如下: [chen@server ~]$ mkdir ~/mydocs/Cprogram //说明:命令中的~/mydocs/Cprogram也可以简写成mydocs/Cprogram   由于在用户chen的家目录中mydocs已经存在,因此这条命令是合法的。   (3)创建popmusic目录。   使用mkdir创建目录时需要注意其父目录是否存在,当用户运行下面这条命令时,mkdir会提示错误。 [chen@server ~]$ mkdir ~/mymusic/popmusic mkdir: 无法创建目录“/home/chen/mymusic/popmusic”: 没有那个文件或目录   这是因为在当前用户的家目录中并不存在目录mymusic,所以无法在其下创建popmusic目录,对于这个问题,可以通过下面这两种方法解决。   第1种方法是先用mkdir创建mymusic目录,再用mkdir创建popmusic目录,执行两条mkdir命令。这种方案如果路径中目录层次较多,则需要多次执行mkdir命令,过程有点烦琐。   第2种方法是使用mkdir的-p选项,命令如下: [chen@server ~]$ mkdir -p ~/mymusic/popmusic //mkdir会首先创建mymusic目录,然后创建popmusic,即路径中所有不存在目录将被逐一创建   在需要创建一个完整的目录结构时,mkdir命令的-p选项非常有用。   (4)创建目录myvideo,其权限为777。使用-m选项指定目录的权限,命令如下: [chen@server ~]$ mkdir -m 777 myvideo [chen@server ~]$ ll -d myvideo drwxrwxrwx. 2 chen chen 4.0K 5月 23 08:25 myvideos   2.?删除目录   使用rmdir命令可以删除目录,rmdir可以理解成英文remove directory的缩写,rmdir命令不能删除非空目录。   rmdir命令的语法格式: rmdir [目录]   【例3-2】 rmdir命令的应用。   (1)删除一个空目录。 [chen@server ~]$ mkdir film //在当前目录下新建一个目录film [chen@server ~]$ rmdir film //删除该目录film   (2)rmdir只能删除空目录,不能直接删除非空目录。下面命令执行时会提示错误。 [chen@server ~]$ mkdir -p videos/mtv //在当前目录下新建目录videos,并在videos下新建目录mtv [chen@server ~]$ rmdir videos rmdir: 删除 'videos' 失败: 目录非空 //删除目录videos时失败   那怎么办呢?针对这个例子,mtv是个空目录,先删除mtv目录使videos成为空目录,再来删除videos,命令如下: [chen@server ~]$ rmdir videos/mtv [chen@server ~]$ rmdir videos //命令执行成功,videos目录被删除   因此,在使用rmdir删除一个目录之前,首先要将该目录下的文件和子目录删除。删除文件需要用到rm命令。rm命令后面再讲解,而且rm也可以删除目录,甚至比rmdir还要“效率高”。基于这个原因,在实际应用中,很多人倾向于使用rm删除目录。   (3)删除在例3-1中创建的所有目录。这里不再赘述,读者可自行完成。 3.1.3 创建空文件   touch命令可以创建空文件或更改文件的创建日期和时间。不过在修改文件的时间属性时,用户必须是文件的所有者,或拥有写文件的访问权限。   touch命令的语法格式: touch [选项] [文件]   touch命令的选项及含义见表3-2。 表3-2?touch命令的选项及含义 选??项 含??义 -a 只更改访问时间 -m 只更改修改时间 -r 使用指定文件的时间属性,而非当前时间 -c 不创建新文件 -d 使用指定字符串表示时间而非当前时间 -t 使用[[CC]YY]MMDDhhmm[.ss]格式的时间戳而非当前时间   【例3-3】 touch命令的应用。   (1)创建单个空文件euler.txt,命令如下: [chen@server ~]$ touch euler.txt //创建file1.txt [chen@server ~]$ ll euler.txt -rw-rw-r--. 1 chen chen 0 5月 23 09:16 file.txt //使用ll命令查看文件的属性   (2)批量创建空文件。   批量创建5个空文件,命令如下: [chen@server ~]$ touch testfile{1..5} [chen@server ~]$ ll testfile? -rw-rw-r--. 1 chen chen 0 5月 23 09:20 testfile1 -rw-rw-r--. 1 chen chen 0 5月 23 09:20 testfile2 -rw-rw-r--. 1 chen chen 0 5月 23 09:20 testfile3 -rw-rw-r--. 1 chen chen 0 5月 23 09:20 testfile4 -rw-rw-r--. 1 chen chen 0 5月 23 09:20 testfile5   若要批量生成10个文件,并想输出01和02这样的字样,则可以使用{01..10},命令 如下: [chen@server ~]$ touch testfile{01..10} [chen@server ~]$ ll testfile?? -rw-rw-r--. 1 chen chen 0 8月 7 09:32 testfile01 -rw-rw-r--. 1 chen chen 0 8月 7 09:32 testfile02 -rw-rw-r--. 1 chen chen 0 8月 7 09:32 testfile03 …… -rw-rw-r--. 1 chen chen 0 8月 7 09:32 testfile10   (3)使用touch命令改变或更新euler.txt文件的访问时间。   首先使用stat命令查看euler.txt文件的时间戳,命令如下: [chen@server ~]$ stat euler.txt 文件:euler.txt 大小:0 块:0 IO 块:4096 普通空文件 设备:fd00h/64768d Inode:274180 硬链接:1 权限:(0664/-rw-rw-r--) Uid:( 1001/ chen) Gid:( 1001/ chen) 环境:unconfined_u:object_r:user_home_t:s0 最近访问:2022-05-23 09:16:38.959182752 +0800 最近更改:2022-05-23 09:16:38.959182752 +0800 最近改动:2022-05-23 09:38:30.264431891 +0800 创建时间:2022-05-23 09:16:38.959182752 +0800 //查看时间戳   接着,执行touch命令修改euler.txt文件的访问时间,命令如下: [chen@server ~]$ touch -a euler.txt   最后,再次执行stat命令查看euler.txt文件的时间戳,验证该文件的访问时间是否已更新,命令如下: [chen@server ~]$ stat euler.txt 文件:euler.txt 大小:0 块:0 IO 块:4096 普通空文件 设备:fd00h/64768d Inode:274180 硬链接:1 权限:(0664/-rw-rw-r--) Uid:( 1001/ chen) Gid:( 1001/ chen) 环境:unconfined_u:object_r:user_home_t:s0 最近访问:2022-05-23 09:45:10.892021912 +0800 最近更改:2022-05-23 09:16:38.959182752 +0800 最近改动:2022-05-23 09:45:10.892021912 +0800 创建时间:2022-05-23 09:16:38.959182752 +0800 //访问时间已更新   (4)将文件euler.txt的访问时间和修改时间设定为指定时间,命令如下: [chen@server ~]$ touch -c -t 202505301230 euler.txt //将euler.txt文件的时间修改为202505301230,即2025年5月30日12点30分 //上述时间按照格式YYYYMMDDHHmm书写。若YYYY省略,则表示使用当前年份 [chen@server ~]$ stat euler.txt 文件:euler.txt 大小:0 块:0 IO 块:4096 普通空文件 设备:fd00h/64768d Inode:274180 硬链接:1 权限:(0664/-rw-rw-r--) Uid:( 1001/ chen) Gid:( 1001/ chen) 环境:unconfined_u:object_r:user_home_t:s0 最近访问:2025-05-30 12:30:00.000000000 +0800 最近更改:2025-05-30 12:30:00.000000000 +0800 最近改动:2022-05-23 10:43:57.128831407 +0800 创建时间:2022-05-23 09:16:38.959182752 +0800 //访问时间和修改时间已更新 3.1.4 文件及目录的复制与删除   1.?文件及目录的复制   使用cp命令可以复制文件或目录,cp是英文copy的缩写。   cp命令的语法格式如下: cp [选项] [源文件|目录] [目标文件|目录]   cp命令的常用选项及含义见表3-3。 表3-3?cp命令的常用选项及含义 选项 含??义 -i 在覆盖目标文件之前将给出提示信息,要求用户确认 -r 如果要复制的源是一个目录,则将递归复制该目录及其子目录内的所有内容。此时的目标必须是一个目录 -p 复制时保持指定的属性(默认包括所有权、权限、时间戳等)   【例3-4】 cp命令的应用。   (1)准备工作——创建一些文件和目录,命令如下: [chen@server ~]$ touch myreport //在当前目录下创建名为myreport的源文件,命令touch myreport使用了相对路径 //绝对路径写法为touch /home/chen/myreport [chen@server ~]$ mkdir bak //在当前目录下创建名为bak的目录,用于文件的备份 [chen@server ~]$ touch ./bak/report00 //在bak目录下,创建名为report00的文件   (2)将文件myreport复制到bak目录下,命令如下: [chen@server ~]$ cp myreport ./bak/ //将源文件myreport不改名而直接复制到/home/chen/bak/目录下 [chen@server ~]$ ls bak myreport //通过ls命令查看bak目录可知myreport文件复制成功   如果复制的目标目录已经存在和源文件同名的文件,则默认会直接覆盖。若希望在执行复制操作时,当发现同名文件时能提示是否覆盖,cp命令则需要加上-i选项。下面再次将myreport文件复制到bak目录下,命令如下: [chen@server ~]$ cp -i myreport ./bak/ cp:是否覆盖'bak/myreport'?<--此处由用户在键盘输入y或者n //若用户输入y,则复制并覆盖原来的同名文件;若用户输入n,则不执行复制操作   注意:建议将文件复制到目录时,直接使用cp -i,避免无意中覆盖同名文件。   (3)改名复制。   ① 将myreport文件复制到bak目录中,并改名为myreport0524。此时目标是文件,myreport0524文件事先并不存在,因此可执行正常复制操作,命令如下: [chen@server ~]$ cp myreport ./bak/myreport0524 [chen@server ~]$ ls bak myreport myreport0524 //bak目录下已经存在两个文件,其中myreport0524中的数字0524一般是备份日期   ② 将myreport文件复制到bak目录中,并改名为report00。此时目标是文件,但是bak目录中已经存在名为report00的文件,若直接执行下面的命令: [chen@server ~]$ cp myreport ./bak/report00 //不推荐这么写   原有的report00文件将在没有任何提示的情况下,直接被覆盖了。怎么办?解决方法仍然是加-i选项,命令如下: [chen@server ~]$ cp -i myreport ./bak/report00   注意:建议改名复制时,使用cp -i,避免无意中覆盖已存在的文件。   (4)复制目录——将目录bak复制至/tmp目录下,命令如下: [chen@server ~]$ cp -r ./bak /tmp [chen@server ~]$ ls /tmp/bak myreport myreport0524 //查看可知整个bak目录已经被复制到了/tmp目录下   (5)保留源文件属性复制。例如在做文件备份或者日志备份时,若希望能够保留源文件的属性,包括所有者和所属群组及时间,执行cp命令时就要加上-p选项。   切换至root用户,使用root用户执行cp命令,命令如下: [chen@server ~]$ su - //使用su命令切换至root用户 [root@server ~]#cp /home/chen/myreport /root/ //cp命令源文件为/home/chen/myreport,目标文件为/root/myreport //为了方便读者理解,此处全部使用文件的绝对路径 [root@server ~]# ll /home/chen/myreport -rw-rw-r--. 1 chen chen 6 5月 24 09:10 /home/chen/myreport //查看源文件/home/chen/myreport的属性 [root@server ~]# ll /root/myreport -rw-r--r--. 1 root root 6 5月 24 09:10 /root/myreport //查看目标文件/root/myreport的属性   显然复制后,目标文件的属性和源文件的属性不同。   下面改为执行cp -p命令,命令如下: [root@server ~]# cp -p /home/chen/myreport /root/ cp:是否覆盖'/root/myreport'?y //将之前/root目录下的myreport文件覆盖 [root@server ~]# ll /home/chen/myreport -rw-rw-r--. 1 chen chen 6 5月 24 09:10 /home/chen/myreport //查看源文件/home/chen/myreport的属性 [root@server ~]# ll /root/myreport -rw-rw-r--. 1 chen chen 6 5月 24 09:10 /root/myreport //查看目标文件/root/myreport的属性   显然,这次复制,目标文件保留了源文件的属性。   最后,恢复Shell环境,命令如下: [root@server ~]# su – chen [chen@server ~]$ //恢复到普通用户chen登录   读者注意,cp命令在复制文件或目录时还要受到文件或目录的权限的制约,有时,由于当前用户权限不足,不能完整地复制目录。   【例3-5】 cp命令的应用(权限问题)。   系统的/etc目录是一个非常重要的目录,因此希望使用cp命令为该目录做一个备份。以普通用户chen身份登录系统,操作如下。   (1)创建backup目录,命令如下: [chen@server ~]$ mkdir backup   (2)使用cp -r命令将/etc完整地复制到刚刚新建的backup目录中。 [chen@server ~]$ cp -r /etc ./backup/ cp: 无法打开'/etc/crypttab' 读取数据: 权限不够 cp: 无法访问 '/etc/pki/CA/private': 权限不够 cp: 无法访问 '/etc/pki/rsyslog': 权限不够 cp: 无法打开'/etc/at.allow' 读取数据: 权限不够 cp: 无法打开'/etc/sysconfig/ip6tables' 读取数据: 权限不够 …   显然,以普通用户chen身份做的/etc目录的备份是一个不完全备份。关于用户对文件或目录的访问权限的知识,可参看第4章内容。   2. 文件及目录的删除   使用rm命令可以删除系统中的文件或目录。rm命令的语法格式: rm [选项] [文件|目录]   rm命令的选项及含义见表3-4。 表3-4 rm命令的选项及含义 选??项 含??义 -f 强制删除。忽略不存在的文件,也不给出提示信息 -r 递归删除目录及目录中的内容 -i 在删除前必须确认   特别注意的是若用户没有相应的操作权限,则rm命令将执行失败。   【例3-6】 rm命令的应用。   (1)准备工作——创建一些目录和文件,命令如下: [chen@server ~]$ touch linux.txt //在当前目录下创建linux.txt文件 [chen@server ~]$ mkdir test //创建目录/home/chen/test [chen@server ~]$ touch test/sort.c //在test目录下创建文件sort.c [chen@server ~]$ touch test/link.c //在test目录下创建文件link.c [chen@server ~]$ touch test/1.log //在test目录下创建一个日志文件1.log [chen@server ~]$ mkdir test/mydocs //创建test目录的子目录mydocs,此处使用的仍然是相对路径 [chen@server ~]$ touch test/mydocs/doc{1,2} //在mydocs目录下创建两个文件:doc1和doc2   (2)删除linux.txt文件,命令如下: [chen@server ~]$ rm linux.txt //rm命令可一次删除一个文件   删除test目录下所有的后缀为c的文件,命令如下: [chen@server ~]$ rm test/*.c //删除/home/chen/test目录下所有的后棳为c的文件 //rm命令可一次删除多个文件   从刚才的例子中,读者可以看出rm命令在删除文件时没有任何提示。通过rm删除的文件不会被放入“回收站”,而是将永远从系统中消失(某些恢复软件可能能找回一些文件)。   (3)删除日志文件1.log。   为了避免误操作,在删除重要文件(如日志文件)时,需要使用-i选项,这样在删除文件前系统会给出提示,并等待用户确认,命令如下: [chen@server ~]$ rm -i test/1.log rm:是否删除普通空文件 'test/1.log'?<-- y //根据提示,输入y并按Enter键才执行删除操作;输入n并按Enter键表示不删除   (4)删除test目录,需使用-r选项,命令如下: [chen@server ~]$ rm -r test //删除test目录,并将test目录下的所有子目录和文件全部删除 [chen@server ~]$ ls -d test ls: 无法访问 'test': 没有那个文件或目录 //验证test目录是否已经被删除   至此,在本例(1)中创建的目录和文件已经全部被删除了。   注意:使用rm命令一定要慎重。以root身份执行rm命令时更要格外谨慎。在删除一个文件前,应认真评估后果。不要随便使用rm -rf这样的选项,因为-r为删除目录,-f为不询问就直接删除,因此若后续的目录名或文件名写错,则可能造成误删。一般而言,被误删的内容多数情况下是无法挽回的。   (5)使用rm命令将3.1.3节中例3-3 touch命令的应用中创建的所有文件删除,命令 如下: [chen@server ~]$ rm euler.txt [chen@server ~]$ rm testfile? [chen@server ~]$ rm testfile?? 3.1.5 文件及目录的移动与重命名   mv命令可以实现文件及目录的移动与重命名,即mv命令有两大类功能:   (1)将源文件或目录(可以是多个)移动到目标目录。若目标目录中已有与源文件或目录同名的文件,则该同名文件会被覆盖,所有的源文件都会被移至目标目录中。所有移到目标目录下的文件都将保留以前的文件名。   (2)对源文件或目录(只能是一个)进行重命名。如果源文件或目录和目标文件或目标目录在同一目录下,则mv命令的作用为重命名。   mv命令的语法格式: mv [选项] [源文件|目录] [目标文件|目录]   mv命令的常用选项及含义见表3-5。 表3-5?mv命令的常用选项及含义 选??项 含??义 -i 覆盖前询问 -f 覆盖前不询问 -n 不覆盖已存在的文件 -u 只有在源文件比目标文件新,或者目标文件不存在时才进行移动 -T 将目标文件视作普通文件处理   【例3-7】 mv命令的应用。   (1)准备工作。 [chen@server ~]$ touch testfile [chen@server ~]$ touch myfile{1,2} //在当前目录下创建testfile、myfile1和myfile2共3个文件 [chen@server ~]$ mkdir data mydocs //创建目录/home/chen/data和/home/chen/mydocs [chen@server ~]$ cp myfile? mydocs/ //将myfile1和myfile2复制到test目录下   到此,完成了如图3-2所示的目录和文件的创建,接下来以此为基础,练习mv命令的使用。 图3-2?本题中用到的初始目录结构   (2)将源文件移动至目标目录下。   ① 使用mv命令将testfile移动至mydocs目录下,命令如下: [chen@server ~]$ mv testfile mydocs/ //将testfile文件从当前目录/home/chen移动至/home/chen/mydocs目录下 [chen@server ~]$ ls mydocs/ myfile1 myfile2 testfile //将testfile移动至mydocs目录成功   ② 使用mv -i命令将myfile1移动至mydocs目录下,命令如下: [chen@server ~]$ mv -i myfile1 mydocs/ mv:是否覆盖'mydocs/myfile1'?<--y //输入y表示替换,输入n表示不替换 //使用/home/chen/myfile1覆盖了/home/chen/mydocs目录下原有的myfile1文件   ③ 使用mv -u命令将myfile2移动至mydocs目录下,命令如下: [chen@server ~]$ mv -u myfile2 mydocs/ //由于源文件myfile2并不比mydocs/myfile2新,因此没有移动,也没有覆盖   (3)重命名文件或目录。当源文件或目录与目标文件或目标的路径一样时,mv命令可以实现文件或目录的重命名。注意源文件或目录必须只有一个,否则会出现命名冲突。   将mydocs目录下的testfile文件重命名为euler,命令如下: [chen@server ~]$ mv mydocs/testfile mydocs/euler [chen@server ~]$ ls mydocs euler myfile1 myfile2 //mydocs目录下testfile不见了,取而代之的是euler文件,重命名成功   将data目录重命名为mydata,命令如下: [chen@server ~]$ mv data mydata   (4)移动目录。将mydocs目录移动至mydata目录中,命令如下: [chen@server ~]$ mv mydocs mydata [chen@server ~]$ ls mydata mydocs //移动成功。mydocs目录的绝对路径为/homechen/mydata/mydocs 3.2 查看文件内容 3.2.1 cat命令   使用cat命令可以将文件的内容输出到屏幕上,常用于查看内容不多的文本文件的内容,长文件会因滚动太快而无法阅读。   cat命令的基本语法: cat [选项] [文件]   cat命令的常用选项及含义见表3-6。 表3-6?cat命令的常用选项及含义 选??项 含??义 -n 给输出的所有行加上编号 --help 查看cat命令的帮助   【例3-8】 使用cat命令查看文件内容。   使用cat命令显示/etc/inittab文件的内容,命令如下: [chen@server ~]$ cat -n /etc/inittab 1 #inittab is no longer used. 2 # 3 #ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. 4 # 5 #Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/Ctrl-alt-del .target ... //此处省略部分内容   cat命令还可以用来建立一个有内容的新文件,为文件追加内容或将几个文件合并为一个文件。   【例3-9】 cat命令的应用。   (1)使用cat命令创建新文件。   使用cat命令在当前目录下创建名为testfile1和testfile2的新文件,命令如下: [chen@server ~]$ cat >testfile1 Hi,openEuler! Hi,Linux! <-- 按快捷键Ctrl+D //输入hi,openEuler!后按Enter键,再输入hi,Linux! 最后按快捷键Ctrl+D保存文件 [chen@server ~]$ cat > testfile2 Hello,cat! <-- 按快捷键Ctrl+D //请输入hello,cat!,输入完毕按快捷键Ctrl+D保存文件   (2)使用cat命令查看刚刚创建的文件testfile1的内容,命令如下: [chen@server ~]$ cat testfile1 Hi,openEuler! Hi,Linux!   (3)使用cat命令向已存在文件追加内容。   ① 使用cat命令查看上一步创建的文件testfile2的内容,命令如下: [chen@server ~]$ cat testfile2 Hello,cat!   ② 使用cat命令向testfile2中追加内容,命令如下: [chen@server ~]$ cat >> testfile2 < I am testing the command of cat. > OK? > I guess OK. > EOF //输入EOF表示输入结束并保存文件   ③ 使用cat命令再次查看testfile2的内容,查看是否追加成功,命令如下: [chen@server ~]$ cat testfile2 Hello,cat! I am testing the command of cat. OK? I guess OK. //追加成功   (4)使用cat命令连接多个文件内容并输出到一个新文件。   下面将testfile1和testfile2这两个文件的内容连接起来后输到文件testfile3,命令如下: [chen@server ~]$ cat -n testfile1 testfile2 > testfile3 //-n选项表示加上了行号 [chen@server ~]$ cat testfile3 1 Hi,openEuler! 2 Hi,Linux! 3 Hello,cat! 4 I am testing the command of cat. 5 OK? 6 I guess OK.   特别注意:如果testfile3已经存在,则上述命令会将testfile3中原有的内容清空。 3.2.2 head命令和tail命令   1.?head命令   使用head命令可以显示指定文件的前若干行内容。如果没有给出具体行的数值,则默认设置为10行。如果没有指定文件,则head会从标准输入读取。   head命令的语法格式: head [选项] [文件]   head命令的常用选项及含义见表3-7。 表3-7?head命令的常用选项及含义 选??项 含??义 -n 显示每个文件的前K行内容;如果附加“-”参数,则除了每个文件的最后K行外显示剩余的全部内容,这里K是数字 -c 显示每个文件的前K字节内容;如果附加“-”参数,则除了每个文件的最后K字节数据外显示剩余的全部内容,这里K是数字 -v 总是显示包含给定文件名的文件头   【例3-10】 head命令的应用。   (1)查看/etc/inittab文件前5行数据内容。 [chen@server ~]$ head -n 5 /etc/inittab #inittab is no longer used. # #ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # #Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/Ctrl-alt-del.target   (2)查看/etc/passwd文件前100字节数据内容。 [chen@server ~]$ head -c 100 /etc/inittab #inittab is no longer used. # #ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # #C   2.?tail命令   使用tail命令可以查看文件的末尾数据,默认显示指定文件的最后10行。如果指定了多个文件,tail则会在每段输出的开始添加相应文件名作为提示。如果不指定文件或文件为“-”,则从标准输入读取数据。   tail命令的语法格式: tail [选项] [文件名]   tail命令的常用选项及含义见表3-8。 表3-8?tail命令的常用选项及含义 选??项 含??义 -n 显示文件最后K行内容,这里K是数字 -c 显示文件的最后K字节内容,这里K是数字 -f 随文件增长即时输出新增数据   【例3-11】 tail命令的应用。   (1)查看/etc/inittab文件末尾5行的数据内容。 [chen@server ~]$ tail -n 5 /etc/inittab #To view current default target, run: #systemctl get-default # #To set a default target, run: #systemctl set-default TARGET.target   (2)查看/etc/inittab文件末尾100字节的数据内容。 [chen@server ~]$ tail -c 100 /etc/inittab un: #systemctl get-default # #To set a default target, run: #systemctl set-default TARGET.target 3.2.3 more命令和less命令   1.?more命令   对于内容较多的文件,一屏幕显示不全,此时可用more命令来逐页阅读。   命令语法: more [选项] [文件]   more命令一次显示一屏文本,显示满之后,停下来,并在终端底部打印出“-- More --”,系统还将同时标示出已显示文本占全部文本的百分比,按空格键显示下一页内容;若要结束浏览,按Q键即可退出。more命令的常用选项及含义见表3-9。 表3-9?more命令的常用选项及含义 选??项 含??义 -p 显示下一屏之前先清屏 -c 与-p类似 -s 将连续空白行显示为一个空白行 -d 在每屏的底部显示更友好的提示信息,而且若用户输入了-个错误命令,则显示出错信息 + 文件内容从第n行开始显示,n是数字 - 一次显示的行数,n是数字   【例3-12】 more命令的应用。   (1)分页显示/etc/services文件的内容。 [chen@server ~]$ more -d /etc/services … //此处省略了显示的文件的部分内容 #Each line describes one service, and is of the form: # #service-name port/protocol [aliases ...] [#comment] --更多--(0%)[按空格键继续,按q键退出。] //-d选项给出了较多提示信息   (2)从第50行开始显示/etc/services文件的内容。 [chen@server ~]$ more +50 /etc/services   (3)一次10行显示/etc/services文件的内容。 [chen@server ~]$ more -c -10 /etc/services //执行该命令后,先清屏,然后将以每次10行的方式显示文件   2. less命令   使用less命令可以分页显示文本文件的内容。less命令的作用与more命令十分相似。不同之处在于,more命令只能向后翻页,而less还可以向前翻页,即less命令允许回卷显示文本文件的内容。   less命令的语法: less [选项] [文件名]   less命令的选项非常多,无须都记住,用到时可以查看帮助,命令如下: [chen@server ~]$ less --help   less命令的常用选项及含义见表3-10。 表3-10?less命令的常用选项及含义 选??项 含??义 -e 当文件显示结束后,自动离开 -s 将连续空白行显示为一个空白行 -m 显示类似more命令的百分比 -N 显示行号   【例3-13】 less命令的应用。   (1)使用less命令查看/etc/services文件的内容。 [chen@server ~]$ less -s /etc/services   (2)查看系统进程信息,使用less命令分页显示,并显示行号。 [chen@server ~]$ ps -ef|less -N //这里使用了管道命令。ps命令负责查看进程信息,less命令负责分页   (3)使用less命令浏览多个文件。 [chen@server ~]$ less testfile1 testfile2 Hi,openEuler! Hi,Linux! testfile1 (file 1 of 2) (END) - Next: testfile2 //当前显示的是testfile1的内容,接下来 //如果用户输入:n后按Enter键,则将切换至testfile2,n表示next //如果用户输入:p后按Enter键,则切换至testfile1,p表示previous 3.3 vim编辑器   系统管理员在进行系统管理或服务器配置时,经常需要修改相关的配置文件,或对纯文本文件进行编辑,这时就需要用到vim。vim是系统中很多命令默认会调用的编辑器,因此管理员一定要能熟练地使用这个编辑器。   vim①是vi improved的缩写,是vi②的增强版。vi即visual interface,它是Linux中的标准文本编辑器,也是UNIX/Linux系统中最常用的文本编辑器工具。   vim的操作方法与vi基本一样,vim在内容显示上增强了颜色支持,不同的颜色代表不同的语义,在使用上更加容易辨析和人性化。 3.3.1 vim的启动与退出   1. 启动vim   在系统提示符下输入vim及文件名称后,就会进入vim的工作界面,示例命令如下: [chen@server ~]$ vim file //若file存在,则打开该文件;若file不存在,则创建file //也可以写成 vim /home/chen/file   使用vim新建文件或编辑现有文件都会直接启动vim。   2. 退出vim   当编辑完文件后,准备返回Shell状态时,需执行退出vim的命令。在vim的命令模式下,按一下冒号键便会进入命令行模式。下面分情况讨论。   (1)直接退出vim,命令如下: :q   (2)保存当前文件内容后再退出vim,命令如下: :wq   (3)不保存文件内容,强制退出vim,命令如下: :q! 3.3.2 常用的vim工作模式   vim的工作模式可分为3种:命令模式、编辑模式和命令行模式。不同工作模式下能够完成的主要操作见表3-11。 表3-11?vim的工作模式 vim工作模式 主 要 操 作 命令模式 光标的移动控制:移动到文本的某个位置 文本的编辑命令,如复制、粘贴、剪切、删除等