文件管理-高级 ---------------江南瘴疠地,逐客无消息

文件管理-高级

1.文件处理三剑客命令初探

1.1 sed

什么是sed?
# sed->流式编辑器,主要擅长对文件的编辑操作,实现定制好编辑文件的指令,然后让sed自动完成对文件的整体编辑

1.1.1为何用 sed

sed vs vim
1.sed可以把处理文件的规则实现写好,然后同一套规则编辑多个文件,而vim只能一个个编辑》用于一套规则处理多个文件
2.sed处理文件,一次只处理一行,即同以时间内存中只有文件的一行内容,无论文件多大,都不会对内存造成过大的压力
=》用于处理大文件

1.1.2 如何用 sed

sed 选项 '定位+命令' 文件路径

选项

-n 取消默认输出
-i 把输出到屏幕中的内容(规则处理的结果+默认输出的结果)b
-r 支持扩展正则元字符

1.1.3 sed 命令

sed规则:定位+命令
定位:行定位 正则定位
# 行定位:
1 定位到第一行,1,3代表从第一行到第三行
不写定位代表定位所有行
# 正则表达式定位:
/rock/ 包含rock的行
/^rock/ 以rock开头的行
/rock$/ 以rock结尾的行
# 数字+正则表达式定位:
'1,9p'代表打印1到8行
'1,/rock/p'代表从第一行到首次匹配到/rock/的行
p 输出打印 '3p'
d 删除 '2d'
c 替换 '1c xxx'
s///g
# 命令可以用;号链接多条,如:1d;3d;5d代表删除1,3,5行
'1s/1/6/' 第一行第一个1改为6
'1s/1/6/g' 第一行所有1改为6 同'c'一样
'1s/1/6/gi' 忽略大小写'i'

1.2 awk

格式化输出,处理有格式的文本,例如:/etc/passwd这种

用法

awk 选项 'pattern{action}' 文件路径
# 选项:
'-F:' 指定分隔符
# 工作流程
awk -F: '{print $1,$3}' /etc/passwd 或:
awk -F: 'NR>=1 && NR<=3{print $1,$3}' /etc/passwd
# 定位: 行定位 正则定位
NR 记录号,等同于行号
-F 指定分隔符号指令
$ 指定列
NF + $ NF ($NF-1) NF末尾列

1.3 grep

擅长过滤内容

grep 'root' 检索所有包含的
grep -n 'root'检索所有包含并且有行号
grep -i 'root'检索所有包含并且不区分大小写
grep -rl 'root' /etc/passwd
ps aux | grep bash

示例:
grep '^root$' /etc/passwd
^代表首部包含,$代表尾部包含

  1. 文件查找

2.1 查看命令所属文件

which ip 查看命令所属文件夹

which [command]

2.2 查找文件

find [options] [path] .. [expression]
# 参数:
-a 并且
-o 或者

2.21 按文件名查找:

find [路径] -name '[匹配规则]'
find /etc -name 'ifcfg -eth0'
find /etc -iname 'ifcdf-eth0' # -i 忽略大小写
find /etc -iname 'ifcfg-eth0' # * 后面随便是什么
find /etc -name '
pass*' 文件名称中包含pass的文件,不管开头还是结尾

2.22 按文件大小查找:

find /etc -size +3M # 大于3M
find /etc -size 3M # =3M
find /etc -size -3M # 小于3M
find /etc -size +3M -ls # -ls 找到后的处理动作
find /etc -size +30M -size -50M

2.23 指定查找的目录深度:

-maxdepth levels 不能单独使用

find / -maxdepth 5 -a -name 'ifcfg-eth0'
# -a 并且, -o 或者 。不加-a代表默认

2.24 按时间找:

参数:

-ctime:创建时间
-atime:访问时间
-mtime:修改时间
find /etc -mtime +3 #修改时间超过3天
find /etc -mtime 3 #修改时间等于3天
find /etc -mtime -3 #修改时间3天以内

2.25 按文件属主、属组找:

格式:
find [路径] [匹配类型]
find /home -user rock #属主是rick的文件
find /home -group it #属组是it组的文件
find /home -user rock -goup it
find /home -user rock -a -group it
# 属主rock 并且属组it
find /home -nouser #用户还存在,在/etc/passwd删除了记录
find /home -nogroup #用户还存在,在/etc/group中删除了记录
find /home -nouser -o nogroup

2.26 按文件类型查找:

格式:
find [路径] [匹配类型]
find /root -type f #f 普通文件
find /dev -type d #d 目录
find /dev -type l #l 链接
find /dev -type b #b 块设备
find /dev -type c #c 字符设备
find /dev -typr s #s 套接字
find /dev -type p #p 管道文件

2.27 根据inode号查找: -inum n

find / -inum 1811

2.28 按文件权限查找:

格式:
find [路径] -perm [可执行权限]
find . -perm 644 -ls
find . -perm -644 -ls
fing . -perm -600 -ls
find /sbin -perm -4000 -ls #包含set UID
find /sbin -perm -2000 -ls #包含set GID
find /sbin -perm -1000 -ls #包含sticky

2.29 找到后处理的动作:

-print
-ls
-delete
-exec
是find终端参数之一,将find查询出来的内容交给其他命令来处理
-ok
find /etc -name 'ifcfg' -print
find /etc -name 'ifcfg
' -ls
find /etc -name 'ifcfg' exec cp -rvf {} /tmp ; #非交互
find /etc -name 'ifcfg
' -ok cp -rvf {} /tmp ;
find /etc -name 'ifcfg' -exec rm -rf {};
find /etc -name 'ifcfg' -exec rm -rf {};
find /etc -name 'ifcfg
' -delete

2.299 扩展知识: find结合xargs:

-I 赋值的意思
find . -name 'egon.txt' | xargs rm -rf
find /etc -name 'ifcfg-eth0' |xargs -I {} cp -rf {} /var/tmp
find /test -name 'ifcfg-ens33' | xargs -I {} mv {} /ttt
find /ttt/ -name 'ifcfg
' |xargs -I {} chmod 666 {}

2.2999 find 作业:

1. 查找 ifconfig命令文件的位置,。用不同的方式实现
2.查找/etc/中的所有子目录(仅目录)复制到/tmp下
3.查找/etc目录复制到/var/tmp/,将var/tmp/etc中的所有目录设置权限777(仅目录)将/var/tmp/etc中所有文件权限设置为666

3.文件的上传下载

3.1 下载

3.11 wget命令

wget -o 本地路径 远程包链接地址 # 将远程报下载到本地,-o指定下载到哪里,可以省略 -0 本地路径,下载到当前文件夹

ps: 如果wget下载提示无法建立ssl链接,则加上选项 --no-check-certificate
wget --no-check0certificate -o 本地路径 远程包链接地址

3.12 curl命令

curl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯成curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、[ftp]等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化,curl可以助一臂之力

curl -o 123.png https://www.xxx.com/img/hello.png
ps:如果遇到下载提示无法建立ssl链接,使用-k选项或者--insecure
curl -k -o 123.png https://www.xxx.com/img/hello.png

3.13 sz 命令

系统默认没有该命令,需要下载 :yum install lrzdz -y
#将服务器上选定的文件下载/发送到本机
sz bal.tar.gz

3.2 上传

3.21 r z命令

系统默认没有该命令,需要下载: yum install lrzsz -y
运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器
rz /etc/passwd #如果文件已经存在,则上传失败,可以用-E选项解决
rz -E /etc/passwd #-E 如果目标文件名已经存在,则重命名传入文件。新文件名将添加一个点和一个数字

4.输出与重定向

输出即把相关对象通过输出设备(显示器等)显示出来,输出又分为正确输出和错误输出,一般情况下标准输出设备为显示器,标准输入设备为键盘
Linux中用:
0代表标准输入
1代表标准正确输出
2代表标准错误输出
#############001图片

4.1 输出重定向:

正常输出是把内容输出到显示器上,而输出重定向是吧内容输出到文件中,>代表覆盖,>>代表追加
ps:标准输出的1可以省略
# 标准输出重定向:
命令 > 文件 以覆盖的方式,把命令的正确输出,输出到指定的文件或设备当中
命令 >> 文件 以追加的方式,把命令的正确输出,输出到指定的文件或设备当中
0002图片
# 标准错误输出重定向:
错误命令 2>文件 以覆盖的方式把命令的错误输出,输出到指定的文件或设备当中
错误命令 2>>文件 以追加的方式把命令的错误输出,输出到指定的文件或设备当中
0003图片
# 注意:错误输出重定向>与>>后边不要加空格
例如:ifconfig > test.log即把ifconfig执行显示的正确内容写入test.log,当前页面不再显示执行结果

注意:

1.下属两个命令作用相同
命令 >>file.log 2>&1
命令 &>>file.log
2.正确日志和错误日志分开保存
命令 >>file1.log 2>>file2.log
3.系统有个常见永华 ls &>/dev/null 正确输出或错误输出结果都不要

4.2 输入重定向

tr 'N' 'n' 命令输入: NO 转变为: no
tr 'rock' 'ROCK' < a1.txt 改变文件内容输出
grep 'root' 命令输入查找
grep 'root' < /etc/passwd 文件内容查找

读写块设备
dd if=/dev/zero of=/file1.txt bs=1M count=20
dd </dev/zero >/file2.txt bs=1M count=20

musql如何恢复备份,了解即可
mysql -uroot -p123 < bbs.sql

5.字符处理命令

5.1 sort命令

用于将文件内容加以排序
-n 依照数值的大小排序
-r 以相反的顺序来排序
-k 以列进行排序
-t 指定分隔符,默认是空格为分隔符

例题:

cat >> file.txt << EOF
b:2
c:2
a:4
e:5
d:1
f:11

例题1

sort file.txt
a:4
b:3
c:2
d:1
e:5
f:11

例题2

sort -t ':' -n -k2 file.txt
d:1
c:2
b:3
a:4
e:5
f:11

例题3

sort -t ':' -n -r -k2 file.txt
f:11
e:5
a:4
b:3
c:2
d:1

5.2 uniq命令

用于检查即删除文本文件中重复出现的行列,一般与sort命令结合使用

-c 在每列旁边显示改行重复出现的次数
-d 仅显示重复出现的行列
-u 仅显示出一次的行列

准备文件,写入一段无序的内容:

cat >> file1.txt << EOF
hello
123
hello
123
func
EOF

例题1

sort file1.txt | uniq
123
func
hello

例题2

sort file1.txt | uniq -c
2 123
1 func
2 hello

例题3

sort file1.txt | uniq -d
123
hello

5.3 cut命令

cut命令用来显示行中的指定部分,删除文件中指定字段
-d 指定字段的分隔符,默认的字段分隔符为'TAB'
-f 显示指定字段的内容
例如:
head -1 /etc/passwd | cut -d ':' -f1,3,4,6

5.4 tr命令

替换或者删除命令
-d 删除字节
tr 'N' 'n' 命令输入: NO 转变为: no
tr 'rock' 'ROCK' < a1.txt 改变文件内容输出

例题1

head -1 /etc/passwd | tr 'root' 'ROOT'
ROOT❌0:0:ROOT:/ROOT:/bin/bash
head -1 /etc/passwd |tr -d 'root'
❌0:0:😕:/bin/bash

例题2

echo 'hello rock qq:411946773' > a1.txt
tr 'egon' 'egon' < a1.txt
hEllO EGON
会替换所有包含的字母

5.5 wc命令

统计,计算数字
-c 统计文件的Bytes数;
-l 统计文件的行数
-w 统计文件中单词的个数,默认以空白字符作为分割符

例题1

ll file.txt
wc -c file.txt
25 file.txt

例题2

cat file.txt
hello
123
hello
123
func
wc -l file.txt
5 file.txt
grep 'hello' file.txt |wc -l
2

例题3

cat file.txt
hello
123
hello
123
func
wc -w file.txt
5 file.txt

6.打包压缩

6.1 什么是打包压缩

打包指的是将多个文件和目录合并为一个特殊文件
然后将特殊文件进行压缩
最终得到一个压缩包

6.2为什么使用压缩包

1.减少占用的体积
2.加快网络的传输

6.3Windoes的压缩和Linux的有什么不同?

Windows : zip 、rar(linux不支持)
Linux :zip、tar、gz tar、bz2、gz
如果希望windows和linux互通,选择zip
ps:压缩包的后缀不重要,但一定要加上

6.4打包压缩方法

6.4.1 打包

tar cvf etc_bak.tar /etc/
tar cvpf etc_bak,tar 不提示删除 '/'
-f:指定打包的文件名称
-c:打包文件
-v:显示打包的过程
-z:使用gzip压缩算法进行压缩处理
-j使用bzip2压缩算法进行压缩处理
-p:在打包过程中,取消移除根目录说明
-x:将tar打包的压缩报解压
-t:查看压缩包内的内容
-c:解压至指定目录

6.4.2 压缩

gzip etc_bak.tar 文件体积边下,并且加上后缀.gz

解压为:
gzip -> gunzip
bzip2 -> bunzip

6.4.3 打包压缩一起

tar czvf etc1_bak.tar.gz /etc
选项z代表gzip的压缩算法
tar cjvf etc1.bak.tar.bz2 /etc/
选项j代表bzip2的压缩算法

6.5.1 打包压缩方法二

选项 -r 递归压缩,压缩目录
选项 -q 静默输出
zip /test/bak.zip a.txt b.txt c.txt
#zip后的第一个参数是压缩包路径,其余为被压缩的文件
ls /test/
bak.zip

zip -rq etc.zip /etc
# 加上-q后压缩过程不再提示

6.6 解压缩

针对xxx.tar.gz 或者xxx.tar.bz2 统一使用
tar xvf 压缩包 -c 解压到的目录
# 无需指定解压算法,tar会自动判断
针对 xxx.zip 用unzip
选项:
-l 显示压缩包的列表信息
-q 静默输出
-d 解压到指定的目录
unzip -1 xxx.zip -d /opt

6.7 拓展

打包压缩通常用于备份文件,文件的名字必须见名知意切应该带上时间、主机名之类

时间命令date

选项:
-d 根据你的描述显示日期
-s 修改日期
%H 小时,24小时制
%M 分钟
%s 从1970年1月1日0点到目前经历的秒数
%S 显示秒
%T 显示时间 24小时制
%d 一个月的第几天
%j 一年的第几天
%m 月份
%w 一个星期的第几天
%W 一年的第几个星期
%y 年的最后两个数字
%Y 年,实际
%F 显示日期

示例

[root@localhost ~]# date
2020年 08月 12日 星期三 20:55:48 CST
[root@localhost ~]# date +%F
2020-08-12
[root@localhost ~]# date +%Y-%m-%d
2020-08-12
[root@localhost ~]#
[root@localhost ~]# date +%y-%m-%d
20-08-12
[root@localhost ~]# date +%T
00:01:03
[root@localhost ~]# date +%H:%M:%S
00:01:11
[root@localhost ~]#
[root@localhost ~]# date +%w
3
[root@localhost ~]# date +%s
1597236988
[root@localhost ~]# date +%d
12
[root@localhost ~]# date +%W
32
[root@localhost ~]# date +%j
225
[root@localhost ~]# date -d "-1 day" +%F
2020-08-11
[root@localhost ~]# date -d "1 day" +%F
2020-08-13
[root@localhost ~]# date -d "+1 day" +%F
2020-08-13
[root@localhost ~]# date -d "3 years" +%F
2023-08-12
[root@localhost ~]# date -d "+3 years" +%F
2023-08-12
[root@localhost ~]# date -d "+3 hours" +%F_%H:%M:%S
2020-08-12_23:58:06

[root@localhost ~]# date -s 20201111
2020年 11月 11日 星期三 00:00:00 CST
[root@localhost ~]# date -s 11:11:11
2020年 11月 11日 星期三 11:11:11 CST
[root@localhost ~]# date -s "20201111 11:11:11"
2020年 11月 11日 星期三 11:11:11 CST

[root@localhost ~]# date +%F
2020-11-11
[root@localhost ~]# date +%T
11:11:29

再看看备份

tar czvf date +%F_bak.tar.gz /etc

tar czvf date +%F_%H_%M_%S_bak.tar.gz /etc # 如果带有时分秒,不要用冒号分隔,因为文件名的命名里不能带有冒号

7.文件系统(操作系统某个组件)

7.1 文件系统介绍

文件是操作系统提供给用户、应用程序操作硬盘的一种功能
文件系统是操作系统内核中负责组织管理硬盘的程序,文件系统提供了文件这种功能

7.1.1文件系统的种类:

linux系统:文件系统
ext3
ext4
xfs SentOS 7默认 xfs 和 btrfs 相比较ext3/4而言,在高伸缩性数据存储方面具有优势
btrfo
windows系统:文件系统
FAT32
NTFS

7.2 文件系统工作原理

文件是由两部分内容组成:

1、文件的元信息,例如权限(rwx)、拥有者、群组、时间参数等
2、文件的实际内容
# 文件系统通常将这两部分的内容分别存放在不同的区块:
1、文件的元信息放置到 inode区块中
2、文件的实际内容则放置到 data block区块中
# 每个inode 与 block 都有自己的编号

superblock 会记录整个档案系统的整体信息,包括inode与blicj的总量、使用量、剩余量等

磁盘的最小存储单位叫做'扇区' 512字节,文件系统将8个'扇区'组织成一个'block'块,一次读取一个'block'块,即8个扇区,是文件存取的最小单位

7.3 inode号码

inode负责存储文件的元信息:
1、 inode编号
2、用识别文件类型,以及用于 stat c函数的模式信息
3、连接数,即有多少文件名指向这个inode
4、属主的ID(UID)
5、属主的组ID (GID)
6、文件的字节数
7、文件所使用的磁盘块的实际数目
8、文件的时间戳。共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间
9、指向数据块的指针
# stat查看某个文件的inode信息
# 每个文件都必须有一个inode,有可能发生inode已经用光,但是硬盘没满,这时,就无法在硬盘上创建新文件

7.3.1 inode的大小

inode 会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域,一个是数据区,存放文件数据,另一个是inode区(inode table),存放inode所包含的信息1GB硬盘,每个inode节点大小为128字节,每1kb设置一个inode,那么inode table大小就会达到128MB,占整块硬盘的12.8%

7.3.2 目录项

目录文件的结构非常简单,就是一系列目录项的列表,每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对用的inode号码
ls /etc 指列出目录文件中的所有文件名
# ls -i 列出整个目录文件,文件名和inode号码
# ls -di 列出目录文件,文件名和inode号码
#ls -l 查看文件详细信息

7.3.3 FAT文件系统

U盘档案系统为FAT格式,没有inode号码存在,所以没有办法一下子将档案的所有block一开始就读出来,当他们不在一个block块过于分散的时候,磁盘只有多转几圈才能全部读取。碎片整理可以解决这个问题,将分散的信息整理到一个档案所属的blocks会正在一起,读取比较容易

7.4 inode的特殊作用

由于inode号码与文件名分离,导致了一些Unix/Linux系统特有的现象:
1.有时,文件名包含特殊字符,无法正常删除,这是,直接删除inode节点,可以删除文件。
2.移动文件或重命名文件,只是改变文件名,不影响inode号码
3.打开一个文件以后,系统就医inode号码来识别这个文件,不在考虑文件名。因此,通常来说,系统无法从inode号码得知文件名

7.5 硬链接和软连接

7.5.1硬链接知识提炼

1.对硬链接文件内容进行修改,会影响到所有文件名;
2.硬链接文件与源文件具有相同inode的不同文件名:一个文件只能有一个inode号,但多个文件的inode号可以相同
3.删除硬链接或者源文件之一,不影响另一个文件名的访问,除非所有的都删除掉,所以硬链接的作用是允许一个文件拥有多个有效路径名,可以建立硬链接到重要文件,防止误删
4.删除所有硬链接,数据会在被磁盘检查或者新数据写入的时候删除回收
5.通过Ln [源文件][目标文件]设置硬链接
6.通过rm -f 删除硬链接
7.目录不可创建硬链接,并且硬链接无法跨区

7.5.2 软连接知识提炼

1.对软连接的源文件或者目标文件进行修改,会影响到所有文件名
2.软连接文件与源文件具有不同的inode号
3.删除软连接文件的源文件,软连接文件将无法使用。
# 软连接作用
1.软件升级
2.企业代码发布
3.不方便目录移动
4.删除源文件后,软连接文件无效,应该也一起删除掉,方便回收
5.执行Ln -s [源文件][目标文件]创建软连接
6.rm -f 删除软连接
7. 可以对目录创建软连接,并且软连接可以跨分区

其他场景

1.大量的小文件问题:可能会是inode耗尽,是的文件无法创建。磁盘利用率低。对于小文件比较多的场景,# 将block划分小一点
2.大文件问题:一个文件占用多个block,是的文件读写速率慢。
# 将block划分大一点

企业面试题

1.从定义:linux系统中,链接有两种,一种被称为软连接,类似一快捷方式,存放指向源文件inode的信息,与源文件inode不同,一种是硬链接,与源文件有相同inode,可以z数据的block
2.从创建方式:硬链接命令ln [源文件][目标文件],软连接命令ln -s[原文件][目标文件]
3.从创建对象:ln命令不能对目录创建硬链接,但是可以对目录创建软连接。因为软连接可以跨越文件系统,硬链接不能。对目录和为客户创建的文件软连接经常用到
4.删除软连接文件,对硬链接和源文件无影响
5.删除文件硬链接,对源文件及链接文件无影响
6.删除源文件,对硬链接读取数据无影响,软连接则失效。会出现红底白字状
7.同时删除源文件和硬链接,源文件才会被真正删除
8.很多硬件设备中的快照原理,类似于硬链接原理

posted @ 2021-07-03 15:28  郝怕怕  阅读(98)  评论(0)    收藏  举报