文章 94
评论 0
浏览 448321
6-文件查找和打包压缩

6-文件查找和打包压缩

一、文件查找

在文件系统上查找符合条件的文件

文件查找:

  • 非实时查找(数据库查找):locate
  • 实时查找:find

1.1 locate

  • locate查询系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db
  • 索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库
  • 索引构建过程需要遍历整个根文件系统,很消耗资源
  • locate和updatedb命令来自于mlocate包

工作特点:

  • 查找快速
  • 模糊查找
  • 非实时查找
  • 搜索的是文件的全路径,不仅仅是文件名
  • 可能只搜索用户具备读取和执行权限的目录

格式:

locate [OPTION]... [PATTERN]...

常用选项

-i 不区分大小写的搜索
-n N只列举前N个匹配项目
-r 使用基本正则表达式

范例:

#搜索名称或路径中包含conf的文件
[10:15:54 root@centos8 ~]#locate conf
使用regex来搜索以“.conf”结尾的文件
[10:16:57 root@centos8 ~]#locate -r "\.conf$"

范例:构建locatedb数据库

[10:18:41 root@centos8 ~]#updatedb
[10:18:54 root@centos8 ~]#ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 2158809 Dec 10 10:18 /var/lib/mlocate/mlocate.db

注意:文件新创建和删除,无法马上更新locate数据库

1.2 find

find是实时查找工具,通过遍历指定路径完成文件查找

工作特点:

  • 查找速度略慢
  • 精确查找
  • 实时查找
  • 查找条件丰富
  • 可能只搜索用户具备读取和执行权限的目录

格式:

find [OPTION]... [查找路径] [查找条件] [处理动作]

查找路径:指定具体目标路径;默认为当前目录

查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

处理动作:对符合条件做操作,默认输出至屏幕

1.2.1 指定搜索目录层级

-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度

范例:

[10:41:01 root@centos8 ~]#find /etc/ -maxdepth 2 -mindepth 2

1.2.2 对每个目录先处理目录内的文件,在处理目录本身

-depth -d

范例:

[10:45:06 root@centos8 ~]#find /data/test
/data/test
/data/test/test2
/data/test/test2/f1
/data/test/test3
/data/test/test3/f1
/data/test/f1
/data/test/f2
[10:45:14 root@centos8 ~]#find /data/test -depth
/data/test/test2/f1
/data/test/test2
/data/test/test3/f1
/data/test/test3
/data/test/f1
/data/test/f2
/data/test

1.2.3 根据文件名和inode查找

-name "文件名称"     支持使用glob,如:*,?,[],[^],通配符要加双引号引起来
-iname "文件名称"    不区分字母大小写
-inum n             按inode号查找
-samefile name      相同inode号的文件
-links n            连接数为n的文件
-regex "PATTERN"    以PATTERN匹配整个文件路径,而非文件名称

范例:

find -name snow.png
find -iname snow.png
find / -name "\.txt"
find /var -name "log*"

[10:59:09 root@centos8 ~]#find / -regex ".*\.txt$"

1.2.4 根据属主、属组查找

-user  USERNAME   查找属主为指定用户的文件
-group GRPNAME    查找属组为指定组的文件
-uid   UserID     查找属主为指定UID号的文件
-gid   GroupID    查找属组为指定GID号的文件
-nouser           查找没有属主的文件
-nogroup          查找没有属组的文件

1.2.5 根据文件类型查找

-type TYPE
TYPE可以是以下形式:
f:普通文件
d:目录文件
l:符号链接文件
s:套接字文件
b:块设备文件
c:字符设备文件
p:管道文件

范例:

[11:09:42 root@centos8 ~]#find / -type b

1.2.6 空文件或目录

-empty

[11:28:17 root@centos8 ~]#find /data/ -empty

1.2.7 组合条件

与:-a,默认多个条件是与关系
或:-o
非 -not !

范例:

[11:15:20 root@centos8 ~]#find / -type b -o -type s
[11:16:30 root@centos8 ~]#find /data/ -user root -a -group zhang
/data/zz
[11:17:06 root@centos8 ~]#find /data/ -user root -group zhang
/data/zz
[11:44:47 root@centos8 ~]#find /home/ ! -user root
/home/zhang
/home/zhang/.bash_logout
/home/zhang/.bash_profile
/home/zhang/.bashrc

德·摩根定律

  • (非A)或(非B)=非(A且B)
  • (非A)且(非B)=非(A或B)

示例:

  • !A -a !B =!(A -o B)
  • !A -o !B =!(A -a B)

1.2.8 排除目录

-prune
写法:
-path DIRNAME -a -prune                            排除dirname目录
\( -path DIRNAME1 -o -path DIRNAME2 \) -a -prune   排除dirname1和dirname2目录
[11:41:09 root@centos8 ~]#find /data/  -path "/data/test" -a -prune -o -type f

1.2.9 根据文件大小来查找

-size [+|-]#UNIT #常用单位:k,M,G,c(byte),注意大小写敏感
#UNIT            #表示(#-1,#),如6k表示5k-6k
-#UNIT           #表示(0,#-1),如-6k表示0k-5k
+#UNIT           #表示(#,..),如+6k表示6k-....

范例:

[11:44:55 root@centos8 ~]#find / -size +10G
/proc/kcore

1.2.10 根据时间戳

#以“天”为单位
-atime [+|-]#
意义同文件大小一样

-mtime
-ctime

#以“分钟”为单位

-amin
-mmin
-cmin

1.2.11 根据权限查找

-perm [/|-]MODE
MODE:精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+从Centos7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0      表示不关注

说明:

find -perm 755 会匹配权限模式恰好是755的文件

只要当任意人有写权限时,find -perm /222就会匹配

只有当每个人都有写权限时,find -perm -222 才会匹配

只有当其他人(other)有写权限时,find -perm -002 才会匹配

1.2.12 正则表达式

-regextype type

-regex pattern

1.2.13 处理动作

-print:默认处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -dils”命令格式输出
fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于-ls >file
-delete:删除查找到的文件,慎用
-ok COMMAND {}\;对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND { } \; 对查找到的每个文件执行由COMMAND指定的命令
{}:用于引用查找到的文件名自身

范例:

给/data文件夹下f开头的文件添加.txt后缀
[14:17:01 root@centos8 data]#find /data/ -name "f*" -exec mv {} {}.txt \;
删除/data文件夹f开头的文件
[14:17:38 root@centos8 data]#find /data/ -name "f*" -delete

1.3 参数替换xargs

由于很多命令不支持管道 | 来传递参数,xargs用于生产某个命令的参数,xargs可以读入stdin的数据,并且以空格符或回车符将stdin的数据分割成为参数

另外,许多命令不能接受过多参数,命令执行可能会失败,xargs可以解决

注意:文件名或者是其他意义的名词内含有空格符的情况

find经常和xargs命令进行组合,形式如下:

find | xargs COMMAND

范例:

seq 10 | xargs

ls | xargs rm

[14:38:50 root@centos8 ~]#seq 10 | xargs -n5
1 2 3 4 5
6 7 8 9 10
[14:38:52 root@centos8 ~]#seq 10 | xargs -n5 mkdir
[14:39:02 root@centos8 ~]#ls
1  10  2  3  4  5  6  7  8  9

二 、压缩和解压缩

主要针对单个文件压缩,而非目录

2.1 compress和uncompress

此工具来源于ncompress包,此工具目前已经很少使用

对应文件是.Z后缀

格式

uncompress file.Z            #解压缩
常用选项:
-d  解压缩
-c  结果输出至标准输出,不删除原文件
-v  显示详情

2.2 gzip和gunzip

来自于gzip包

对应的文件是.gz后缀

格式:

gzip [OPTION].. FILE...
常用选项:
-k keep,保留原文件,Centos 8 新特性
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,保留原文件不改变
-# 指定压缩比,#取值1-9,比值越大压缩比越大

2.3 bzip和bunzip2

来自于bzip2包

对应的文件是.bz2后缀

格式:

bzip2 [OPTION]... FILE...
选项:
-k keep,保留原文件
-d 解压缩
-c 结果输出至标准输出,保留原文件不改变
-# 指定压缩比,#取值1-9,默认9

2.4 xz和unxz

来自于xz包

对应的文件是.bz2

格式:

xz [OPTION]... FILE...
选项:
-k keep,保留原文件
-d 解压缩
-c 结果输出至标准输出,保留原文件不改变
-# 指定压缩比,#取值1-9,默认6

2.5 zip和unzip

zip可以实现打包目录和多个文件成一个文件并压缩,但可能会丢失文件属性信息,如:所有者和组信息,一般建议用tar替代

分别来自于zip和unzip包

对应的文件是.zip

三、打包和解包

3.1 tar

tar 即 Tape ARchive 磁带归档,可以对目录和多个文件打包一个文件,并且可以压缩,保留文件属性不丢失,常用于备份功能,推荐使用

对应的文件是.tar后缀

格式:

tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F
][-K <文件>][-L <媒体容量>][-N <日期时间>][-T <范本文件>][-V <卷册名称>][-X
<范本文件>][-<设备编号><存储密度>][--after-date=<日期时间>][--atime-preserve][-- backuup=<备份方式>]
[--checkpoint][--concatenate][--confirmation][--delete][-- exclude=<范本样式>][--force-local]
[--group=<群组名称>][--help][--ignore-failed- read][--new-volume-script=]
[--newer-mtime][--no-recursion][--null][-- numeric-owner][--owner=<用户名称>][--posix]
[--erve][--preserve-order][--preserve- permissions][--record-size=<区块数目>]
[--recursive-unlink][--remove-files][--rsh- command=<执行指令>][--same-owner][--suffix=<备份字尾字符串>]
[--totals][--use- compress-program=<执行指令>][--version][--volno-file=<编号文件>][文件或目录...]

选项:

man tar 查询

3.2 split

split命令可以分割一个文件为多个文件

范例:

格式:
split -b Size -d tar-file-name prefix-name

英文后缀
[15:13:06 root@centos8 ~]#split -b 10M zero  zero-ext
数字后缀
split -b 10M -d zero  zero-ext

合并
[15:17:28 root@centos8 ~]#cat zero-exta* >zero

标题:6-文件查找和打包压缩
作者:Carey
地址:HTTPS://zhangzhuo.ltd/articles/2021/05/17/1621222868185.html

生而为人

取消