文件管理(高级)
目录
内容概述
1.初识文本处理三剑客
-1.1 sed
-1.2 awk
-1.3 grep
2.文件管理之:文件查找
3.文件管理之:上传与下载
4.文件管理之:输出与重定向
5.文件管理之:字符处理
-5.1 tr命令
-5.2 wc命令
6.文件管理之:打包与压缩
7.文件系统
-7.1 什么是文件系统
-7.2 拓展
-7.3 硬链接与软链接
内容详细
1.初识文本处理三剑客 (别慌,后边还会学到)
-
1.1 sed
流式编辑器,主要擅长对文件的编辑操作,我们可以事先定制好编辑文件的指令,然后让sed自动完成对文件的整体编辑.
# 用法
sed 选项 '定位+命令' 文件路径
# 选项
-n 取消默认输出
-r 支持扩展正则元字符(由于尚未学习正则,所以此处暂作了解)
-i 立即编辑文件
# 定位
行定位:
1定位到第一行
1,3代表从第1行到第3行
不写定位代表定位所有行
正则表达式定位:
/egon/ 包含egon的行
/^egon/ 以egon开头的行
/egon$/以egon结尾的行
数字+正则表达式定位
"1,8p"代表打印1到8行,
"1,/egon/p"则代表取从第1行到首次匹配到/egon/的行
# 命令
d
p
s///g
命令可以用;号连接多多条,如1d;3d;5d代表删除1,3,5行
# =========================》用法示例:p与d
[root@localhost ~]# sed '' a.txt
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@localhost ~]# sed -n '' a.txt
[root@localhost ~]#
[root@localhost ~]# sed -n '1,/xxx/p' a.txt
egon1111
22222egon
3333egon33333
4444xxx44444
[root@localhost ~]# sed '1,/xxx/d' a.txt
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@localhost ~]# sed '1d;3d;5d' a.txt
22222egon
4444xxx44444
6666egon6666egon666egon
# =========================》用法示例: s///g
[root@localhost ~]# cat a.txt
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@localhost ~]# sed 's/egon/BIGEGON/g' a.txt # 把所有行的所有的egon都换成BIGEGON
BIGEGON1111
22222BIGEGON
3333BIGEGON33333
4444xxx44444
5555xxx55555xxxx555xxx
6666BIGEGON6666BIGEGON666BIGEGON
[root@localhost ~]#
[root@localhost ~]# sed '/^egon/s/egon/GAGAGA/g' a.txt # 以egon开头的行中的egon换成GAGAGA
GAGAGA1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@localhost ~]# sed '6s/egon/BIGEGON/' a.txt # 只把第6行的egon换成BIGEGON,加上g代表全部
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666BIGEGON6666egon666egon
[root@localhost ~]#
[root@localhost ~]# sed '1,3s/egon/BIGEGON/g' a.txt # 把1到3行的egon换成BIGEGON
BIGEGON1111
22222BIGEGON
3333BIGEGON33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@localhost ~]# cat a.txt | sed '1,5d' # sed也支持管道
6666egon6666egon666egon
# 加上-i选项,直接修改文件,通常会在调试完毕确保没有问题后再加-i选项
-
1.2 awk
awk 主要用来处理有格式的文本,比如 /etc/passwd
# 用法
awk 选项 'pattern{action}' 文件路径
# 选项
-F 指定行分隔符
# 工作流程
awk -F: '{print $1,$3}' /etc/passwd
1、awk会读取文件的一行内容然后赋值给$0
2、然后awk会以-F指定的分隔符将该行切分成n段,最多可以达到100段,第一段给$1,第二段给$2,依次次类推
3、print输出该行的第一段和第三段,逗号代表输出分隔符,默认与-F保持一致
4、重复步骤1,2,3直到文件内容读完
# 内置变量
$0 一整行内容
NR 记录号,等同于行号
NF 以-F分隔符分隔的段数
# pattern可以是
/正则/
/正则/ # 该行内容匹配成功正则
$1 ~ /正则/ # 第一段内容匹配成功正则
$1 !~ /正则/ # 第一段内容没有匹配成功正则
比较运算:
NR >= 3 && NR <=5 # 3到5行
$1 == "root" # 第一段内容等于root
# action可以是
print $1,$3
# 用法示例
[root@localhost ~]# cat a.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]# awk -F: '/^root/{print $1,$3}' a.txt
root 0
[root@localhost ~]# awk -F: '$1 ~ /^d/{print $1,$3}' a.txt
daemon 2
[root@localhost ~]# awk -F: '$1 !~ /^d/{print $1,$3}' a.txt
root 0
bin 1
adm 3
lp 4
[root@localhost ~]# awk -F: 'NR>3{print $1}' a.txt
adm
lp
[root@localhost ~]# awk -F: '$1 == "lp"{print $0}' a.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]#
[root@localhost ~]# cat a.txt | awk -F: '{print $1}' # awk也支持管道
root
bin
daemon
adm
lp
-
1.3 grep
grep擅长过滤内容
# 用法
grep 选项 '正则' 文件路径
# 选项
-n, --line-number 在过滤出的每一行前面加上它在文件中的相对行号
-i, --ignore-case 忽略大小写
--color 颜色
-l, --files-with-matches 如果匹配成功,则只将文件名打印出来,失败则不打印
通常-rl一起用,grep -rl 'root' /etc
-R, -r, --recursive 递归
# 示例
[root@localhost ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# grep -n 'bash$' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
44:egon:x:1000:1000:egon:/home/egon:/bin/bash
[root@localhost ~]# grep -rl 'root' /etc
# grep也支持管道,我们可以发现三剑客命令都支持管道
[root@localhost ~]# ps aux |grep ssh
root 968 0.0 0.2 112908 4312 ? Ss 14:05 0:00 /usr/sbin/sshd -D
root 1305 0.0 0.3 163604 6096 ? Ss 14:05 0:00 sshd: root@pts/0
root 1406 0.0 0.3 163600 6240 ? Ss 14:05 0:00 sshd: root@pts/1
root 2308 0.0 0.0 112724 984 pts/1 R+ 15:30 0:00 grep --color=auto ssh
[root@localhost ~]# ps aux |grep [s]sh
root 968 0.0 0.2 112908 4312 ? Ss 14:05 0:00 /usr/sbin/sshd -D
root 1305 0.0 0.3 163604 6096 ? Ss 14:05 0:00 sshd: root@pts/0
root 1406 0.0 0.3 163600 6240 ? Ss 14:05 0:00 sshd: root@pts/1
2.文件管理之:文件查找
1.查找命令所属的文件
[root@localhost ~]# which ip
/usr/sbin/ip
# ps: 一些命令的路径都被配置到了环境变量PATH里
echo $PATH
2.查找文件
1、命令查找(查找某一个命令在什么地方)
which [command]
2、文件查找(find)
1、按照文件名称查找
格式:
find [路径] -name '[匹配规则]'
例1:查询以.html结尾的文件
[root@localhost ~]# find /root -name '*.php'
/root/2.php
例2:查询/etc目录下,文件名称中包含pass的文件
[root@localhost ~]# find /etc -name '*pass*'
例3:查询/ect目录下,文件名以pass开头的文件
[root@localhost ~]# find /etc -name 'pass*'
2、按照文件类型查找
-(f) : 普通文件
d : 目录文件
l : 链接文件
b : 块设备文件
c : 字符设备
s : 套接字文件
p : 管道文件
格式:
find [路径] -type '[匹配类型]'
例1:查询/root目录下,有哪些普通文件
[root@localhost ~]# find /root/ -type f
例2:查询/dev目录下,有哪些字符设备文件?
[root@localhost ~]# find /dev/ -type c
例3:查询/run目录下,有哪些套接字文件
[root@localhost ~]# find /run -type s
3、按照属性来查
属主,属组,不存在用户或用户组的
格式:
find [路径] -user '用户名'
find [路径] -group '组名'
find [路径] -nouser
find [路径] -nogroup
例1:查询/tmp目录下,有哪些属主为root的文件?
find /tmp -user 'root'
例2:查询/tmp目录下,有哪些属组为test的文件?
find /tmp -group 'test'
例3:查询/tmp目录下没有用户的文件有哪些?
find /tmp -nouser
例4:查询/tmp目录下没有属组的文件?
find /tmp -nogroup
例5:查询/tmp目录下,没有属组同时没有属主的文件?
find /tmp -nouser -nogroup
4、按照权限来查找
可读权限(4),可写权限(2),可执行权限(1)
格式:
find [路径] -perm [数字权限]
例1:查询/tmp目录下,权限为664的文件有哪些
find /tmp -perm 664
例2:查询/tmp目录下,属组只有可读可写权限的文件有哪些?
find /tmp -perm 664
5、按照文件大小查
dd :创建文件的命令
if : 指定读取的文件
of : 指定写入的文件
bs : 每次写入的大小
count : 写几次
例1:写入文件50M
dd if=/dev/zero of=/tmp/test4.txt bs=10M count=5
参数:
-a : 并且(默认)
-o : 或者
格式:
find [路径] -size '文件大小'
例1:查新/tmp目录下,大小为40M的文件有哪些?
find /tmp/ -size 40M
例2:查找/tmp目录下,大小为20M的文件有哪些?
find /tmp -size 20M
例3:查找/tmp目录下,大于20M的文件并且小于40M的文件有哪些?
find /tmp -size +20M -a -size -40M
例4:查找/tmp目录下,小于30M 或 大于40M的文件有哪些?
find /tmp -size -30M -o -size +40M
6、按照时间来查询
date -s '修改的时间'
同步互联网时间:/usr/sbin/ntpdate ntp1.aliyun.com
参数:
-ctime : 创建时间
-atime : 访问时间
-mtime : 修改时间
+7 : 7天前创建的
7 :正好七天创建的
-7 :7天内创建的
格式:
find [路径] -ctime '7'
例1:查询7天前创建的文件?
find /tmp -ctime +7
例2:查询7天内创建的文件?
find /tmp -ctime -7
找到文件后的处理:
-print
-ls
-delete
-exec
-ok
[root@localhost ~]# find /etc -name "ifcfg*" -print # 必须加引号
[root@localhost ~]# find /etc -name "ifcfg*" -ls
[root@localhost ~]# find /etc -name "ifcfg*" -exec cp -rvf {} /tmp \; # 非交互
[root@localhost ~]# find /etc -name "ifcfg*" -ok cp -rvf {} /tmp \; # 交互
[root@localhost ~]# find /etc -name "ifcfg*" -exec rm -rf {} \;
[root@localhost ~]# find /etc -name "ifcfg*" -delete # 同上
拓展:
[root@localhost ~]# find . -name "egon*.txt" |xargs rm -rf
[root@localhost ~]# find /etc -name "ifcfg-eth0" |xargs -I {} cp -rf {} /var/tmp
[root@localhost ~]# find /test -name "ifcfg-ens33" |xargs -I {} mv {} /ttt
[root@localhost ~]# find /ttt/ -name "ifcfg*" |xargs -I {} chmod 666 {}
3.文件管理之:上传与下载
1、上传与下载
1、上传
yum install lrzsz -y
rz
2、下载
wget
下载文件(yum install wget -y)
参数:
-O : 指定下载的路径及文件名
curl
读取文件(Linux自带命令)
参数:
-o : 指定下载的路径及文件名
sz
从Linux主机中下载文件到客户端
4.文件管理之:输出与重定向
输出即把相关对象通过输出设备(显示器等)显示出来,输出又分正确输出和错误输出 一般情况下标准输出设备为显示器,标准输入设备为键盘.
linux中用:
0代表标准输入
1代表标准正确输出
2代表标准错误输出
ps:
1.下述两个命令作用相同
命令 >>file.log 2>&1
命令 &>>file.log
2.正确日志和错误日志分开保存
命令 >>file1.log 2>>file2.log
3.系统有个常见用法 ls &>/dev/null 正确输出或错误输出结果都不要.(null可以理解为黑洞或垃圾站)
输入重定向
#没有改变输入的方向,默认键盘,此时等待输入
[root@egon ~]# tr 'N' 'n'
No
no
[root@egon ~]# tr 'N' 'n' < file.txt
#没有改变输入的方向,默认键盘,此时等待输入
[root@egon ~]# grep 'root'
oldboy
root
root
[root@egon ~]# grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 读写块设备
[root@egon ~]# dd if=/dev/zero of=/file1.txt bs=1M count=20
[root@egon ~]# dd </dev/zero >/file2.txt bs=1M count=20
# mysql如何恢复备份,了解即可,不用关注。
[root@qls ~]# mysql -uroot -p123 < bbs.sql
5.文件管理之:字符处理
字符处理命令
1、字符排序
将字符按照一定的顺序排序,(默认情况下:按照第一个字符进行排序)
参数:
-n # 依照数值的⼤⼩排序
-r # 以相反的顺序来排序
-k # 以某列进⾏排序
-t # 指定分割符,默认是以空格为分隔符
例1:将1.txt按照数值从大到小进行排序
[root@localhost ~]# cat 1.txt | sort -n -r
例2:将1.txt按照第二列数值从大到小进行排序
[root@localhost ~]# cat 1.txt | sort -n -r -k2
例3:将1.txt按照冒号来分割,按照第三列来从大到小进行排序
[root@localhost ~]# cat 1.txt | sort -n -r -k3 -t:
2、字符去重
⽤于检查及删除⽂本⽂件中重复出现的⾏列,⼀般与 sort 命令结合使⽤。
参数:
-c # 在每列旁边显示该⾏重复出现的次数。
-d # 仅显示重复出现的⾏列。
-u # 仅显示出⼀次的⾏列。
例1:输出2.txt文件中,每个词出现的次数
[root@localhost ~]# cat 2.txt | sort | uniq -c
例2:在第一题的基础上,仅显示出现重复的列
[root@localhost ~]# cat 2.txt | sort | uniq -c -d
例3:在第一题的基础上,仅显示未重复的列
[root@localhost ~]# cat 2.txt | sort | uniq -c -u
例4:在第一题的基础上,要求按照重复的次数进行排序
[root@localhost ~]# cat 2.txt | sort | uniq -c | sort -r
3、切割字符
cut命令⽤来显示⾏中的指定部分,删除⽂件中指定字段
参数:
-d # 指定字段的分隔符,默认的字段分隔符为"TAB";
-f # 显示指定字段的内容;
例1:获取当前系统中所有的用户ID
[root@localhost ~]# cat /etc/passwd | cut -d: -f3
例2:在第一题的基础上,按照从大到小的顺序排序
[root@localhost ~]# cat /etc/passwd | cut -d: -f3 | sort -r -n
4、删除和替换字符
替换或删除命令: tr
参数:
-d # 删除字符
例1:删除/etc/passwd中root
[root@localhost ~]# cat /etc/passwd | tr -d 'root'
例2:将/etc/passwd文件中所有的bash转换成BASH
[root@localhost ~]# cat /etc/passwd | tr 'bash' "BASH"
5、字符统计
统计,计算数字命令:wr
参数:
-c # 统计⽂件的字节数;
-l # 统计⽂件的⾏数;
-w # 统计⽂件中单词的个数,默认以空⽩字符做为分隔符
例1:统计3.txt中有多少个字节的数据
[root@localhost ~]# cat 4.txt | wc -c
例2:统计3.txt中有多少行数据
[root@localhost ~]# cat 4.txt | wc -l
例3:统计3.txt中有多少个词(一段数字和字母连续不断的字符串,不包含特殊字符)
[root@localhost ~]# cat 4.txt | wc -w
6.文件管理之:打包与压缩
打包与压缩
什么是压缩包?
打包指的是将多个⽂件和⽬录合并为⼀个特殊⽂件,然后将该特殊⽂件进⾏压缩,得到压缩包。
为什么要用压缩包
1.减少占⽤的体积
2.加快⽹络的传输
Windows的压缩和Linux的有什么不同
1、Windows : zip
2、Linux : tar
Linux下常⻅的压缩包类型
格式 压缩⼯具
.zip zip压缩⼯具
.gz gzip压缩⼯具,只能压缩⽂件,会删除源⽂件(通常配合tar使⽤)
.bz2 bzip2压缩⼯具,只能压缩⽂件,会删除源⽂件(通常配合tar使⽤)
.tar.gz 先使⽤tar命令归档打包,然后使⽤gzip压缩
.tar.bz2 先使⽤tar命令归档打包,然后使⽤bzip压缩
gzip : 只用gzip压缩算法压缩,不打包
-d : 解压gzip压缩
bzip2 :只用bzip压缩算法压缩,不打包
1、打包
tar
tar打包时会将路径同时打包到压缩包中,如果从根目录开始,tar会自动删除/目录。
参数:
-f : 指定打包的文件名称
-c : 打包文件
-v : 显示打包的过程
-z : 使用gzip压缩算法进行压缩处理(推荐)
-j : 使用bzip2压缩算法进行压缩处理
-P : 在打包过程中,取消移除根目录说明
-x : 将tar打包的压缩包解压
-t : 查看压缩包内内容
-C : 解压至指定目录
例1:将/etc/passwd压缩到/tmp/passwd.tar.gz
[root@localhost tmp]# tar -czvf /tmp/passwd.tar.gz /etc/passwd
例2:将/etc下,所有的普通文件打包成etc.tar.gz
[root@localhost tmp]# find /etc/ -type d -exec tar -czPvf etc.tar.gz {} \;
例3:将/etc/passwd压缩到/tmp/passwd.tar.bz2
[root@localhost tmp]# tar -cjPvf /tmp/passwd.tar.bz2 /etc/passwd
例4:将/etc下,所有的普通文件打包成etc.tar.bz2
[root@localhost tmp]# find /etc/ -type d -exec tar -cjPvf etc.tar.bz2 {} \;
例5:将第三题中的压缩包解压到/tmp/test目录下
[root@localhost tmp]# tar -xf etc.tar.gz
例6:将etc.tar.gz解压到/tmp/test/目录下
[root@localhost etc]# tar -xf etc.tar.gz -C /tmp/test/
zip
1、打包
格式:
zip [压缩包名称] [压缩文件...]
参数:
-r : 递归压缩
-q : 静默输出
例1:压缩/etc/yum.conf /etc/passwd
[root@localhost test]# zip test.zip /etc/yum.conf /etc/passwd
例2:压缩/etc目录
[root@localhost test]# zip -r etc.zip /etc/*
2、解压(unzip)
参数:
-l : 显示压缩包内部信息
-d : 解压到指定目录
例1:解压上述test.zip
[root@localhost etc]# unzip etc.zip
2、压缩算法
1、gzip压缩算法(压缩完成之后,立即删除源文件)
参数:
-d : 解压
gzip [文件]
2、bzip2压缩算法
3、打包压缩和find结合
find [路径] [匹配规则] -exec [压缩打包] \;
例1:将/etc目录下的所有普通文件进行压缩
[root@localhost etc]# tar -zcPvf vvv.tar.gz `find /etc/ -type f | xargs`
7.文件系统
- 7.1什么是文件系统?
文件系统filesystem是操作系统内核中负责组织管理磁盘的程序.
在传统的磁盘与档案系统(又称为文件系统filesystem)的应用中,一个磁盘分割槽/分区只能被格式化成为一个文件系统,所以我们可以说一个filesystem就是一个partition分区.但是由于新技术的利用,例如我们常听到的LVM与软体磁盘阵列(software raid,又称软raid),这些技术可以将一个分区格式化为多个文件系统(例如LVM),也能够将多个分区合成一个文件系统(LVM, RAID)!所以说,目前我们在格式化时已经不再说成针对分区来格式化了,通常我们可以称呼一个可被挂载的资料为一个文件系统而不是一个分区!
linux常见文件系统有xfs、ext4 和 btrfs 文件系统,它们都是日志文件系统(其特点是文件系统将没提交的数据变化保存到日志文件,以便在系统崩溃或者掉电时恢复数据)
- 7.2拓展
1.inode信息
文件的inode中文译名为"索引节点",是 UNIX 操作系统中的一种数据结构,其本质是结构体。
Inode负责储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小inode
从根本上讲, inode中存放的是除了文件的名字以及文件真实内容之外,所有有关文件的信息/元数据(metadata),如下:
inode 编号
● 用来识别文件类型,以及用于 stat C 函数的模式信息
● 链接数,即有多少文件名指向这个inode。
● 属主的ID (UID)
● 属主的组 ID (GID)
● 文件的字节数
● 文件所使用的磁盘块的实际数目
● 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间.
● 指向数据块的指针
2.inode块大小
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息.
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%.
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df -i 命令.
查看每个inode节点的大小,可以用如下命令:
# 查看ext文件系统信息
sudo dumpe2fs -h /dev/hda | grep "Inode size"
# 查看xfs文件系统信息
xfs_info /dev/sda1
[root@localhost ~]# xfs_info /dev/sda1
# isize表示为inode大小;agcount为存储区群组(allocation group)的个数;
meta-data=/dev/sda1 isize=512 agcount=4, agsize=65536 blks
# sectsz指逻辑扇区(sector)的容量大小;
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
# bsize指block容量大小;
data = bsize=4096 blocks=262144, imaxpct=25
# sunit与swidth与stripe相关
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
# internal指登录区(log p)在文件系统内部,而不在外部
# bsize指占用区块大小,blocks为数量;
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
# realtiem p区域信息;extsz指extent size;
realtime =none extsz=4096 blocks=0, rtextents=0
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况.这时,就无法在硬盘上创建新文件.
3.inode号码
每个inode都有一个号码,操作系统用inode号码来识别不同的文件.
这里值得重复一遍,Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:
首先,系统找到这个文件名对应的inode号码;
其次,通过inode号码,获取inode信息;
最后,根据inode信息,找到文件数据所在的block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码,例如:
ls -i demo.txt
4.inode特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象.
有时,文件名包含特殊字符,无法正常删除.这时,直接删除inode节点,就能起到删除文件的作用.
移动文件或重命名文件,只是改变文件名,不影响inode号码.
打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名.因此,通常来说,系统无法从inode号码得知文件名.
[root@localhost ~]# ls -i egon.txt
17696455 egon.txt
[root@localhost ~]# vim egon.txt # vim编辑器写文件,会改变inode号
[root@localhost ~]# ls -i egon.txt
17696461 egon.txt
[root@localhost ~]#
[root@localhost ~]# mv egon.txt EGON.txt # 重命名文件不会影响inode号
[root@localhost ~]# ls -i EGON.txt
17696461 EGON.txt
问:为什么每次修改完服务器配置文件后,都需要重新加载一下配置文件?
答:因为vim每次修改完后,Inode号都会变,系统还是读取的原来inode号的配置文件,每次修改完服务器的配置文件,都要重启服务,重新读一下配置文件.
- 7.3硬链接与软链接
Linux链接分两种:
1、一种被称为硬链接(Hard Link)
【硬连接】:硬连接指通过索引节点号来进行连接.inode是可以对应多个文件名的
# 扩展阅读
1.inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1.反过来,删除一个文件名,就会使得inode节点中的"链接数"减1.当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域.
这里顺便说一下目录文件的"链接数".创建目录时,默认会生成两个目录项:"."和"..".前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的".硬链接“.
2.另一种被称为软链接,即符号链接(Symbolic Link)
软链接文件有类似于Windows的快捷方式.它实际上是一个特殊的文件.在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息.
文件2和文件1的inode号码虽然不一样,但是文件2的内容是文件1的路径。读取文件2时,系统会自动将访问者导向文件.因此,无论打开哪一个文件,最终读取的都是文件1.这时,文件2就称为文件1的"软链接"(soft link)或者"符号链接(symbolic link).
这意味着,文件2依赖于文件1而存在,如果删除了文件1,打开文件2就会报错:"No such file or directory".这是软链接与硬链接最大的不同:文件2指向文件1的路径,而不是文件1的inode号码,文件1的inode"链接数"不会因此发生变化.
# 硬链接知识提炼:
0.对硬链文件内容进行修改,会影响到所有文件名;
1.硬链接文件与源文件具有相同inode的不同文件名:一个文件只能有一个inode号,但多个文件的inode号可以相同.
2.删除硬链接或者原文件之一,不影响另一个文件名的访问,除非所有的都删除掉,所以硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能.
3.删除所有硬链接,数据会在被磁盘检查或者新数据写入时候删除回收.
4.通过ln [原文件] [目标文件]设置硬链接
5.通过rm –f 删除硬链接
6.目录不可创建硬链接,并且硬链接无法跨区
# 示例
[root@localhost ~]# touch small_egon.txt
[root@localhost ~]# ln small_egon.txt big_egon.txt
[root@localhost ~]# ls -i small_egon.txt
17696460 small_egon.txt
[root@localhost ~]# ls -i big_egon.txt
17696460 big_egon.txt
[root@localhost ~]# ll small_egon.txt # 两个硬链接文件的硬链接数均为2
-rw-r--r-- 2 root root 0 12月 16 17:05 small_egon.txt
[root@localhost ~]# ll big_egon.txt # 两个硬链接文件的硬链接数均为2
-rw-r--r-- 2 root root 0 12月 16 17:05 big_egon.txt
# 软链接知识总结
# 0. 对软链的源文件或目标文件内容进行修改,会影响到所有文件名;
# 1. 软链接文件与源文件具有不同的inode号
# 2. 删除软连接文件的源文件,软链接文件将无法使用,软链接作用
- 1.软件升级
- 2.企业代码发布
- 3.不方便目录移动
# 3. 删除源文件后,软连接文件无效,应该也一起删除掉,以便回收
# 4. 执行ln –s [原文件] [目标文件]创建软链接
# 5. rm –f 删除软链接
# 6、可以对目录创建软链接,并且软连接可以跨分区
[root@localhost ~]# touch 1.txt
[root@localhost ~]# ln -s 1.txt 2.txt
[root@localhost ~]# ls -i 1.txt
17696462 1.txt
[root@localhost ~]# ls -i 2.txt
17696463 2.txt
[root@localhost ~]#
[root@localhost ~]# ll 1.txt # 两个软链接文件的硬链接数均为1
-rw-r--r-- 1 root root 0 12月 16 17:26 1.txt
[root@localhost ~]# ll 2.txt # 两个软链接文件的硬链接数均为1
lrwxrwxrwx 1 root root 5 12月 16 17:26 2.txt -> 1.txt
[root@localhost ~]#
[root@localhost ~]# rm -rf 1.txt # 删掉1.txt,会发现2.txt不可用
[root@localhost ~]# ll 2.txt
lrwxrwxrwx 1 root root 5 12月 16 17:26 2.txt -> 1.txt
[root@localhost ~]#
[root@localhost ~]# mkdir /dir1
[root@localhost ~]# ln /dir1 /dir2
ln: "/dir1": 不允许将硬链接指向目录
[root@localhost ~]#
[root@localhost ~]# ln -s /dir1/ /dir2

浙公网安备 33010602011771号