Kevin_306

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~

posted on 2021-04-06 19:28  熊猫小虾  阅读(162)  评论(0编辑  收藏  举报

导航