Linux学习的第四天

1.vim编辑工具

Vim是一个类似于vi的著名的功能强大、高度可定制的文本编辑器,在vi的基础上改进和增加了很多特性。

可以理解为Windows的记事本,或Notepad++

 

今天我们学习了vim 的四种基本模式

为什么我们需要学习vim呢?

因为Linux一切皆文件,而我们工作中最多的就是修改某个服务的配置(其实就是修改文件的内容)

也就是说如果没有vi/vim 我们很多工作都无法完成。所以vim是学习Linux最重要的命令之一

如果Linux系统上没有安装vim 我们可以输入 yum install vim-common vim-enhanced 来安装
1.普通模式

主要ing是控制光标移动,可对文本进行复制、粘贴、删除等工作。

1.移动光标:跳转至整段的行尾:G(shift+g) 跳转到整段的行首:gg跳转光标本行的尾部:$跳转光标本行的首部:^

比如20gg: 就会跳转至20行;2.复制yy: 复制光标所在的行;nyy: 复制多行;

比如20yy:会复制当前光标和下面的20行 按p(P)进行复制

3.粘贴p(小写): 粘贴到光标所在行的下一行;P(大写):粘贴到光标所在行的上一行;

 

4.删除dd: 删除光标所在的行;3dd:删除多行;

20dd:会删除当前光标和下面的20行

D:删除光标所在行后的所有内容;x: 删除一个字符d+G:从头删到尾;

5.移动|剪贴:删除+粘贴=移动

5.替换r:替换某个字符; 光标选中对应的内容 --> r --> 新的内容;R: 连续替换;

6.撤销:u:撤销上一次的操作,可以连续使用(连续撤销);

 

2.编辑模式

从普通模式进入到编辑模式,然后可随意更改内容。

i: 进入编辑模式,光标不会发生变化; a: 进入编辑模式,光标会向后移动一位; o: 进入编辑模式,会在当前光标下一行插入一行空白的行;

I:进入编辑模式,移动到光标所在的行首; A:进入编辑模式,光标会移动到行尾; O:进入编辑模式,会在当前光标上一行插入一行空白的行;

编辑完成后,按Esc退回至普通模式

 

3.命令模式

从普通模式进入到命令模式 按 : 就可以进入

保存退出: :w : 保存 :q : 退出 :wq :保存并退出

:q! :退出,不保存任何修改; :wq! :强制保存,并退出 ( 操作的文件无权限时;)

替换(和sed一致): :1,5s#d#b#g # 明确指定替换1-5行中出现的所有的d,替换成b :%s#d#b#g # 搜索整个文件中,将d全部替换成b

搜索:/string:n:下翻N:上翻跳转::20快速跳转至20行;

 

4.视图模式

从普通模式进入试图模式,主要进行批量操作。

可视行(按行操作):shift+v: 选中需要的行;然后y;shift+v: 选中需要的行;然后d;

可视块(字符操作): 添加注释: 在最前面添加# 算注释; ctrl+v --> shift+i --> # -->Esc--->Esc 删除注释: ctrl+v --> shift+i --> x|d

 

扩展

1.在命令模式中我们可以临时用一些命令来打开文件的”显示行号“、”忽略大小写“等环境

:set nu 显示行号

:set ic 忽略大小写,在搜索的时候有用

:set ai 自动缩进

:set list 显示制表符(空行、tab键)

:set no[nu|ic|ai..] 取消临时设定的变量

2.如果希望”显示行号“、”忽略大小写“等;永久生效,则需要将内容写入配置文件中;

~/.vimrc 个人环境变量,针对当前用户(优先级高)

/etc/vimrc 全局环境变量,针对系统中所有用户

如果个人vim环境没有配置,则使用全局vim环境变量配置

如果个人vim环境和全局环境变量产生冲突,优先使用个人vim环境变量。

[root@zhang ~]# vim ~/.vimrc
输入
set nu
set ic

如果想使用高逼格的vimrc

https://www.cnblogs.com/zyos/p/9213878.html

3.vimdiff文件对比

相同文件之间差异的对比,通常用与对比修改前后差异

diff :文件对比

vimdiff :以vim方式打开两个文件对比,高亮显示不同的内容

 

当使用vim打开一个新的文件时,如果修改了文件内容,此时强制退出终端,则会造成异常现象;
#假设打开filename文件被意外关闭,需要删除同文件名的.swp文件即可解决
#rm -f .filename.swp
如果在编辑过程中,会话突然关闭了;我们可以将vim进程给挂起:Ctrl+z

2.文件属性

当我们使用ls -l 列出目录下所有文件时,通常会以长格式的方式显示,其实长格式显示就是我们windows下看到的文件详细信息,我们将其称为文件属性,那整个文件的属性分为十列。

[root@zhang ~]# ls -l 1.txt 
-rw-r--r--. 1 root root 80 Jul 10 15:09 1.txt

-rw-r--r--. 1:第一个字符是文件类型,其他则是权限

1 2:硬链接次数

root 3:文件属于哪个用户

root 4:文件属于哪个组

80 5:文件大小

Jul 10 15:9 6:最新修改的时间与日期

1.txt 7:文件名称

3.文件类型

通常我们使用颜色或者后缀名称来区分文件类型,但很多时候不是很准确;

所以我们可以通过ls -l 以长格式显示一个文件的属性,通过第一列的第一个字符来近一步判断文件具体的类型。

文件类型说明

文件类型字母 类型含义
- 普通文件(文本,二进制,压缩,图片,日志等)
d 目录文件
b 设备文件(块设备)存储设备硬盘/dev/sda,/dev/sr0
c 设备文件(字符设备),终端/dev/tty1
s 套接字文件,进程与进程间的一种通信方式(socket插座)
l 链接文件

但有些情况下,我们无法通过ls -l查看文件的类型,比如:一个文件,它可能是普通文件、也可能是压缩文件、或者是命令文件等,那么此时就需要使用file来更加精准的判断这个文件的类型

[root@zhang ~]# file /etc/hosts
/etc/hosts: ASCII text
[root@zhang ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c5ad78cfc1de12b9bb6829207cececb990b3e987, stripped
[root@zhang ~]# file /dev/sda
/dev/sda: block special

Linux文件扩展名不代表任何含义,为了我们人能更好的识别该文件是什么类型

 

4.链接文件

4.1Inode与Block

文件有文件名与数据,在Linux上被分成两个部分:数据data与文件元数据 metadata

1.数据data block,数据块是用来记录文件真实内容的地方,我们将其称为block

2.元数据metadata,用来记录文件大小、创建时间、所有者等信息,我们将其称为Inode

3.需要注意:Inode 不包含文件名称,inode仅包含文件的元数据信息,具体来说有以下内容:

  • 文件的字节数

  • 文件的User ID Group ID

  • 文件的读、写、执行权限

  • 文件的时间戳

  • 链接数,即有多少文件名指向这个inode

  • 文件数据block的位置

每个inode都是一个编号,操作系统是通过inode来识别不同的文件。

对于系统来说,文件名只是inode便于识别的别名,或者绰号。(便于我们人识别)

对于系统来说,文件是通过文件名打开的文件,实际上系统内部这个过程分为如下三步:

  • 首先,系统找到这个文件名对应的inode编号

  • 其次,通过inode编号,获取inode信息

  • 最后,根据inode信息,找到文件数据所在的block,读出数据。

4.2软链接

  • 什么是软链接:软链接相当于windows的快捷方式;

  • 软链接实现原理:

  1. 软链接文件会将inode指向源文件的block

  2. 当我们访问这个软链接时,其实访问的是源文件本身;

Linux学习的第四天

 

软链接场景实践
准备网站1.1版本
[root@zhang ~]# mkdir /data/rainbow-v1.1 -p
[root@zhang ~]# echo "123" > /data/rainbow-v1.1/index.html
创建软链接
[root@zhang ~]# ln -s /data/rainbow-v1.1/   /data/rainbow
[root@zhang ~]# ll /data/
total 0
drwxr-xr-x. 2 root root 38 Jul 7 19:10 job
lrwxrwxrwx. 1 root root 19 Jul 10 16:59 rainbow -> /data/rainbow-v1.1/
drwxr-xr-x. 2 root root 24 Jul 10 16:59 rainbow-v1.1
检查程序
[root@zhang ~]# cat /data/rainbow/index.html
123
更新一个新的网站版本
[root@zhang ~]# mkdir /data/rainbow-v2.1
[root@zhang ~]# echo "789" > /data/rainbow-v2.1/index.html
升级
[root@zhang ~]# rm -f /data/rainbow && ln -s /data/rainbow-v2.1/   /data/rainbow
[root@zhang ~]# cat /data/rainbow/index.html
789
回退
[root@zhang ~]# rm -f /data/rainbow && ln -s /data/rainbow-v1.1/   /data/rainbow
[root@zhang ~]# cat /data/rainbow/index.html
123

 

4.3硬链接

硬链接类似与超市多个门,无论从哪个门进入,看到的内容都是一样的。不会影响进入超市

回到系统中,我们对硬链接的解释:不同的文件名指向同一个inode,简单的说就是指向同一个真实的数据源。

 

Linux学习的第四天

软链接与硬链接的区别
  • In命令创建硬链接,In -s 命令创建软链接

  • 目录不能创建硬链接,并且硬链接不可以跨越分区系统

  • 软链接支持对目录创建,同时也支持跨越分区系统

  • 硬链接文件与源文件的inode相同,软链接文件与源文件inode不同

  • 删除软链接文件,对源文件及硬链接文件无任何影响

  • 删除文件的硬链接,对源文件及链接文件无任何影响

  • 删除链接文件的源文件,对硬链接无影响,会导致软链接失效

  • 删除源文件及其硬链接文件,整个文件会被真正的删除

4.4文件时间

Linux下文件有3个时间的,分别是aime,mtime,ctime

简名 全名 中文名 含义
atime access time 访问时间 文件中的数据最后被访问的时间
mtime modify time 修改时间 文件内容被修改的最后时间
ctime change time 变化时间 文件的元数据发生变化。比如权限,所有者等

先准备一个文件

[root@zhang ~]# echo "zhangdage" >>A.txt
[root@zhang ~]# stat A.txt
File: ‘A.txt’
Size: 10       Blocks: 8         IO Block: 4096   regular file
Device: fd00h/64768d Inode: 100682097   Links: 1
Access: (0644/-rw-r--r--) Uid: (   0/   root)   Gid: (   0/   root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2021-07-10 17:35:23.176355498 +0800
Modify: 2021-07-10 17:35:23.176355498 +0800
Change: 2021-07-10 17:35:23.176355498 +0800
Birth: -

 

atime
[root@zhang ~]# cat A.txt 
zhangdage
[root@zhang ~]# stat A.txt
File: ‘A.txt’
Size: 10       Blocks: 8         IO Block: 4096   regular file
Device: fd00h/64768d Inode: 100682097   Links: 1
Access: (0644/-rw-r--r--) Uid: (   0/   root)   Gid: (   0/   root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2021-07-10 17:39:10.717346515 +0800
Modify: 2021-07-10 17:35:23.176355498 +0800
Change: 2021-07-10 17:35:23.176355498 +0800
Birth: -
访问时间会发生变化
mtime
[root@zhang ~]# echo "hello" >> A.txt 
[root@zhang ~]# stat A.txt
File: ‘A.txt’
Size: 16       Blocks: 8         IO Block: 4096   regular file
Device: fd00h/64768d Inode: 100682097   Links: 1
Access: (0644/-rw-r--r--) Uid: (   0/   root)   Gid: (   0/   root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2021-07-10 17:39:10.717346515 +0800
Modify: 2021-07-10 17:41:06.607341941 +0800
Change: 2021-07-10 17:41:06.607341941 +0800
Birth: -
内容被修改后,mtime会变化,ctime时间发生变化的原因是,内容变化了,inode所记录的大小也需要变化,所以时间发生了变化
ctime
[root@zhang ~]# chown adm A.txt 
[root@zhang ~]# stat A.txt
File: ‘A.txt’
Size: 16       Blocks: 8         IO Block: 4096   regular file
Device: fd00h/64768d Inode: 100682097   Links: 1
Access: (0644/-rw-r--r--) Uid: (   3/     adm)   Gid: (   0/   root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2021-07-10 17:39:10.717346515 +0800
Modify: 2021-07-10 17:41:06.607341941 +0800
Change: 2021-07-10 17:43:22.675336569 +0800
Birth: -
修改文件属性后,只有ctime发生变化
上一篇:C# Halcon联合编程问题(二)


下一篇:bzoj1024 [SCOI2009]生日快乐【dfs】