07 文件查找和打包压缩 20210406
文件查找和打包压缩
内容概述
locate find xargs gzip和gunzip bzip2和bunzip2 xz和unxz zip和unzip tar
1 文件查找
在文件系统上查找符合条件的文件
文件查找:locate, find
- 非实时查找(数据库查找):locate
- 实时查找:find
1.1 locate
locate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db 索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库 索引构建过程需要遍历整个根文件系统,很消耗资源
来自于mlocate包
工作特点:
- 查找速度快
- 模糊查找
- 非实时查找
- 搜索的是文件的全路径,不仅仅是文件名
- 可能只搜索用户具备读取和执行权限的目录
常用选项:
- -i 不区分大小写的搜索
- -n N 只列举前N个匹配项目
- -r 使用基本正则表达式
范例: locatedb创建数据库
执行#updatedb 建议找个空闲的时间,数据过多的话,时间就会很长
[root@centos8 ~]#dnf -y install mlocate [root@centos8 ~]#locate conf locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
[root@centos8 ~]#updatedb [root@centos8 ~]#ll /var/lib/mlocate/mlocate.db -rw-r----- 1 root slocate 1041065 Jun 11 20:08 /var/lib/mlocate/mlocate.db
需要生成数据库文件前先安装
dnf -y install mlocate
#Rocky安装
[root@rocky8 ~]# dnf -y install mlocate
1.2 find
find 是实时查找工具,通过遍历指定路径完成文件查找
工作特点:
- 查找速度略慢
- 精确查找
- 实时查找
- 查找条件丰富
- 可能只搜索用户具备读取和执行权限的目录
格式: find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
生产环境中,文件数量过多,使用ls来看文件的话,会造成磁盘的IO,系统的卡顿,使用find会比较好一些。
1.2.1#查看find的帮忙说明
[root@rocky8 ~]# find --help
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
default path is the current directory; default expression is -print
expression may consist of: operators, options, tests, and actions:
operators (decreasing precedence; -and is implicit where no others are given)
......
1.2.2 使用find对比
[root@rocky8 ~]# find . ./.bash_logout ./.bash_profile ./.bashrc ./.cshrc ./.tcshrc ./anaconda-ks.cfg ./reset_v5.sh ./.bash_history ./.viminfo
[root@rocky8 ~]# ll -Ra
1.2.3 指定搜索目录层级
-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度
范例:指定搜索/etc下面的第一个目录,再往后的就不搜索了
[root@rocky8 ~]# find /etc -maxdepth 1
对比一下不指定目录的,就会全部显示出来,发现目录不止一个
1.2.4 对每个目录先处理目录内的文件,再处理目录本身
[root@rocky8 ~]# find /boot -d
1.2.5根据文件名和inode查找
-name "文件名称":支持使用glob,如:*, ?, [], [^],通配符要加双引号引起来 -iname "文件名称":不区分字母大小写 -inum n 按inode号查找 -samefile name 相同inode号的文件 -links n 链接数为n的文件 -regex “PATTERN”:以PATTERN匹配整个文件路径,而非文件名称
#加引号“ ”,否则会丢失一些文件
[root@rocky8 ~]# find /etc -name "*passwd"
1.2.6 选项-regex “PATTERN”:以PATTERN匹配整个文件路径,而非文件名称
[root@centos7-kevin306 ~]# find -regex ".*\.txt$"
./1.txt
#ubuntu
1.2.7根据属主、属组查找
-user USERNAME:查找属主为指定用户(UID)的文件 -group GRPNAME: 查找属组为指定组(GID)的文件 -uid UserID:查找属主为指定的UID号的文件 -gid GroupID:查找属组为指定的GID号的文件 -nouser:查找没有属主的文件 -nogroup:查找没有属组的文件
[root@centos7-kevin306 ~]# find /home -user kevin
/home/kevin
/home/kevin/.bash_logout
/home/kevin/.bash_profile
/home/kevin/.bashrc
[root@centos7-kevin306 ~]# find /home -user kevin -ls #加ls可以看到是属于谁的文件,所属组所属人都可以看到
1093232 0 drwx------ 2 kevin kevin 62 Apr 13 2021 /home/kevin
1093233 4 -rw-r--r-- 1 kevin kevin 18 Apr 1 2020 /home/kevin/.bash_logout
1093234 4 -rw-r--r-- 1 kevin kevin 193 Apr 1 2020 /home/kevin/.bash_profile
1093235 4 -rw-r--r-- 1 kevin kevin 231 Apr 1 2020 /home/kevin/.bashrc
1.2.8 nouser 搜索没有所有者
[root@rocky8 ~]# useradd ma
[root@rocky8 ~]# id ma
[root@rocky8 ~]# find /home –type d -ls
[root@rocky8 ~]# userdel ma
[root@rocky8 ~]# find /home -nouser
1.2.9空文件或目录
[root@rocky8 ~]# find /etc -empty -ls
第二列的数值大小都是0,是空的
#查询 空文件(第七列数值)
[root@rocky8 ~]# find /etc -empty -type f -ls (空并且是文件)
1.2.10组合查询
与:-a ,默认多个条件是与关系 或:-o 非:-not !
#查询 空文件(第七列数值)
[root@rocky8 ~]# find /etc -empty -o -type f (/tec下的空或者是文件)
[root@rocky8 ~]# find /boot -empty -o -type f -ls (/boot下的空或者文件)
1.2.11取反: [root@rocky8 ~]# find /boot ! -type f
看的详细一些: #find /boot ! -type f -ls (第三行d开头的,说明是文件夹)
1.2.12德·摩根定律:
- (非 A) 或 (非 B) = 非(A 且 B)
- (非 A) 且 (非 B) = 非(A 或 B)
示例: !A -a !B = !(A -o B)
!A -o !B = !(A -a B)
[root@rocky8 ~]# find /home ? ! \( -user kevin -o -user ma \)
[root@rocky8 ~]# find ! -user kevin -a ! -user ma
或者:2种不同的写法 一样的结果
1.2.13 排除目录
1#查找/etc/下,除/etc/security目录的其它所有.conf后缀的文件
[root@centos7-kevin306 ~]# find /etc -path '/etc/security' -a -prune -o -name "*.conf"
去etc下面搜索,然后发现security这个文件夹,就把它剪切走,搜索除这个之外的其他的.conf结尾的文件
2#查找/etc/下,除/etc/security和/etc/systemd两个目录的所有.conf后缀的文件
[root@rocky8 ~]# find /etc \( -path "/etc/security" -o -path "/etc/systemd" \) -a -prune -o -name "*.conf"
3#排除/proc和/sys目录
root@ubuntu1804:~# find / \( -path "/sys" -o -path "/proc" \) -a -prune -o -type f -a -mmin -1
1.2.14 根据文件大小来查
-size [+|-]#UNIT 常用单位:k, M, G,c(byte),注意大小写敏感 #UNIT: (#-1, #] 如:6k 表示(5k,6k] (不包括5K,包括6K) -#UNIT:[0,#-1] 如:-6k 表示[0,5k] (0-5K,不包括6K) +#UNIT:(#,∞) 如:+6k 表示(6k,∞) (不包括6K)
举例: find / -size 10G
find / -size -10G
find / -size +10G
#dd if=/dev/zero of=/etc/test.img bs=1 count=2048
#find /etc -size 2048c -ls (c输出字节数)
#rocky环境
#ubuntu
1.2.15 根据时间戳
#以“天”为单位
-atime [+|-]#
-mtime
-ctime
时间戳也遵循这个逻辑: #: [#,#+1) -#: [0,#) +#: [#+1,∞]
举例:
-mtime 10 (第十天到第十一天的,这是不包括第十一天的)
-mtime -10 (这是表示搜索的是十天以内,不包括第十天的)
-mtime +10 (这是表示搜索的是第十一天以上,包括第十一天)
1.2.16根据权限查找
-perm [/|-]MODE MODE: 精确权限匹配 /MODE:任何一类(u,g,o)对象的权限中只要有一位匹配即可,或关系,+ 从CentOS 7开始淘汰 -MODE:每一类对象都必须同时拥有指定权限,与关系 0 表示不关注
1.[root@rocky8 ~]# find /etc -perm 600 精确匹配
#ubuntu
2. root@ubuntu1804:~# find /etc -perm 600 -ls
加上-ls显示的更加直观
3.读或者写 ,r4或者 w2 ,0是不关心,无所谓;
[root@rocky8 ~]# find /etc -perm /600 -ls (或者的关系)
4[root@rocky8 ~]# find /etc -perm -600 -ls (并且的关系)
5 比较以下2个命令
[root@rocky8 ~]# find /etc -perm /002 |wc -l
[root@rocky8 ~]# find /etc -perm -002 |wc -l
等价的,
说明:
find -perm 755 会匹配权限模式恰好是755的文件;
只要当任意人有写权限时,find -perm /222就会匹配;
只有当每个人都有写权限时,find -perm -222才会匹配;
只有当其它人(other)有写权限时,find -perm -002才会匹配;
1.2.17 执行动作
范例:
#备份配置文件,添加.orig这个扩展名
find -name ".conf" -exec cp {} {}.orig \;
#提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;
#在主目录中寻找可被其它用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;
#查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data –type f -perm 644 -name "*.sh" –exec chmod 755 {} \;
1#rocky 举例
[root@rocky8 ~]# find -name "*.txt"
[root@rocky8 ~]# find -name "*.txt" -delete (此命令太危险!慎用!不作任何提示就把相关的文件删除了)
2.移动文件,每移动一个都会询问,输入y才会移动
[root@rocky8 ~]# find -name "*.txt" -ok mv {} /data \;
< mv ... ./a.txt > ? y
< mv ... ./b.txt > ? y
< mv ... ./c.txt > ? y
# [root@rocky8 ~]# find -name "*.txt" -exec mv {} /data \;
exec不需要询问,直接执行,这个也是需要慎用的,容易产生风险;
省略...
1.2.18 xargs 参数替换
由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数 据,并且以空格符或回车符将 stdin 的数据分隔成为参数,另外,许多命令不能接受过多参数,命令执行 可能会失败,xargs 可以解决;
注意:文件名或者是其他意义的名词内含有空格符的情况;
find 经常和 xargs 命令进行组合,形式如下:
find | xargs COMMAND
#xgrgs 相当于xargs echo,默认会把换行符给替换掉
范例1:[root@rocky8 ~]# xargs
1
2
3
1 2 3 (此处输入ctrl +d ,显示效果)
范例2:
[root@rocky8 ~]# seq 10 |xargs
范例3:
[root@rocky8 ~]# seq 10 |xargs touch 相当于创建了10个文件;
范例4:选项 xargs -n1 一次传一个执行
[root@rocky8 ~]# seq 10 |xargs -n1 touch
范例5; -lt 按时间排序查看; -ls按大小查看排序;
[root@rocky8 ~]# find -name ".txt" | xargs ls -ls 按大小查看
[root@rocky8 ~]# find -name ".txt" | xargs ls -lt 按时间查看
范例6.一次传2个文件
[root@rocky8 ~]# seq 10 |xargs -n2 echo
范例7:#批量创建和删除用户
[root@rocky8 ~]#echo user{1..10} |xargs -n1 useradd
此处使用for循环建立账号
[root@rocky8 ~]# for i in {1..10};do useradd user$i;done
批量删除
[root@rocky8 ~]# echo user{1..10} | xargs -n1 userdel -r
#ubuntu
root@ubuntu1804:~# cat /etc/passwd
root@ubuntu1804:~# cat /etc/group
删除创建的用户
范例8:touch 'a b.txt'创建的文件删除
#以字符nul分隔
root@ubuntu1804:~# find -type f -name "*.txt" -print0 | xargs -0 rm
-print0 表示assii码中的0,0作为文件名称的分隔符,然后0作为切割名称,删除;
1.2.19 范例: bilibili并发下载视频
[root@rocky8 ~]# yum install python3-pip -y
[root@rocky8 ~]# pip3 install you-get
[root@rocky8 ~]# seq 10 | xargs -i -P3 you-get https://www.bilibili.com/video/BV1HZ4y1p7Bf?p={}
此时已经在后台下载了...
2 压缩打包
1.gzip和gunzip (压缩比还行)
常用选项:
-k keep, 保留原文件,CentOS 8 新特性
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,保留原文件不改变
-# 指定压缩比,#取值为1-9,值越大压缩比越大
1.1压缩文件
[root@rocky8 data]# ll /var/log/messages
[root@rocky8 data]# cp /var/log/messages . (此处有个红色.)
[root@rocky8 data]# ll
total 1556
-rw------- 1 root root 1592587 Oct 22 10:21 messages
[root@rocky8 data]# cp messages m #拷贝messages重命名为m;
[root@rocky8 data]# gzip m
ll查看结果,m.gz 大小
1.2解压缩:gzip -d +文件名
[root@rocky8 data]# gzip -d m.gz
1.3 gzip --help
查看帮助,相对于centos7,新增了一个选项 -k,表示压缩的时候保留原来的文件名
1.4 -k,表示压缩的时候保留原来的文件名;
[root@rocky8 data]# gzip -k m
2.bzip2和bunzip2
1.来自于 bzip2 包
[root@rocky8 data]# bzip2 m
比gzip压缩还厉害
解压缩 -d 选项;
[root@rocky8 data]# bzip2 -d m.bz2
解压缩出来结果,如图
同样的 -k选项,保留原来的文件;压缩为m.bz2了;
2. 压缩目录
[root@rocky8 data]# bzip2 /bin/bash
压缩结果:大概小了一半
解压缩:
[root@rocky8 data]# bunzip2 /bin/bash.bz2
3.xz和unxz
来自于 xz 包
常用选项:
-k keep, 保留原文件 -d 解压缩,相当于unxz -c 结果输出至标准输出,保留原文件不改变 -# 压缩比,取值1-9,默认为6
4.zip和unzip
zip 可以实现打包目录和多个文件成一个文件并压缩,但可能会丢失文件属性信息;
如:所有者和组信息,一般建议使用 tar 代替
来自于zip 和 unzip 包
范例1:
#打包并压缩 zip -r /sysconfig.zip /etc/sysconfig/ #不包括目录本身,只打包目录内的文件和子目录 cd /etc/sysconfig; zip -r /root/sysconfig.zip * #默认解压缩至当前目录 unzip /backup/sysconfig.zip
打包压缩
打包之后查看文件
#解压文件并查看结果 unzip /sysconfig.zip -d /opt
#解压缩至指定目录,如果指定目录不存在,会在其父目录(必须事先存在)下自动生成 unzip /backup/sysconfig.zip -d /tmp/config cat /var/log/messages | zip messages #-p 表示管道 unzip -p message.zip > message
范例2: 非交互式加密和解密
[root@rocky8 ~]# zip -r -P 123456 Mage.zip /etc/
#整个etc目录下的文件打包,注意加 -r;
[root@rocky8 ~]# ll Mage.zip -h 查看大小
[root@rocky8 ~]# unzip Mage.zip -d /mnt
解压需要输入密码,回车之后,随即解压成功
查看结果;
5.打包和解包tar
tar 即 Tape ARchive 磁带归档,可以对目录和多个文件打包一个文件,并且可以压缩,保留文件属性不丢失,常用于备份功能,推荐使用;
(1) 创建归档,保留权限
tar -cpvf /PATH/FILE.tar FILE...
(2) 追加文件至归档: 注:不支持对压缩文件追加
tar -rf /PATH/FILE.tar FILE...
(3) 查看归档文件中的文件列表
tar -t -f /PATH/FILE.tar
(4) 展开归档
tar xf /PATH/FILE.tar
tar xf /PATH/FILE.tar -C /PATH/
压缩:#tar cf etc.tar /etc (压缩etc下面的文件,命名为etc)
#tar cvf etc.tar /etc (压缩etc下面的文件,命名为etc.tar,加上v,可以看到打包的过程)
这里提示的是''/''省略了,不然还原的话会覆盖''/''下的etc文件,影响了原文件的配置内容了;
1.查看文件列表:
#tar tvf etc.tar (#etc的目录前没有保留''/''了)
2.解包:tar xf etc.tar
3.或者解压到某一目录 -C
#tar xf etc.tar -C /tmp
4.边压缩边打包 tar zcf etc3.tar.gz /etc/
[root@rocky8 data]# tar zcf etc3.tar.gz /etc/
5.解压缩 tar xf etc3.tar.gz
tar xf etc3.tar.gz -C /home/wang #-C后面可以自定义目录
6.查看结果:
7.另外还有几种压缩方式,对比下:
bz2压缩需要加上 -j (小j)
[root@rocky8 data]# tar jcf etc1.tar.bz2 /etc/
xz压缩需要加上 -J
[root@rocky8 data]# tar Jcf etc2.tar.xz /etc/
gz压缩需要加上 -z (小z)
[root@rocky8 data]# tar zcf etc3.tar.gz /etc/
对比下压缩结果:
8.查看压缩格式:
[root@rocky8 data]# file etc1.tar.bz2
[root@rocky8 data]# file etc2.tar.xz
[root@rocky8 data]# file etc3.tar.gz
9.利用 tar 进行文件复制,相当于做了备份 tar c /data/ | tar x -C /backup
此处希望看到打包消耗的时间,加了time
[root@rocky8 ~]# time (tar c /data/ | tar x -C /backup)
mkdir /backup 创建目录
备份 [root@rocky8 ~]# time (tar c /data/ | tar x -C /backup)
查看备份的结果
[root@rocky8 data]# ls /backup/data/
20211027renew~