8.文件查找和软件解压缩
1.文件查找
1.1 locate
locate:通过名字查找文件(模糊查找)
locate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db
若数据库不存在可以执行updatedb可以更新数据库构建索引
索引构建过程需要遍历整个根文件系统,很消耗资源,避免在高峰时间段使用
格式:
locate [OPTION]... PATTERN...
常用选项
- -i 不区分大小写
- -n N 只列举前N个匹配项目
- -r 使用基本正则表达式
范例:
#使用正则来搜索以.newfile结尾的文件
[root@centos8 data]# touch test.newfile
[root@centos8 data]# locate -r '\.newfile$'
[root@centos8 data]# updatedb
[root@centos8 data]# locate -r '\.newfile$'
/data/test.newfile
#查找以.conf结尾的前10个文件
[root@centos8 data]# locate -n 10 -r '\.conf$'
/boot/loader/entries/20200914151302543507749550121287-0-rescue.conf
/boot/loader/entries/20200914151302543507749550121287-4.18.0-193.14.2.el8_2.x86_64.conf
/boot/loader/entries/20200914151302543507749550121287-4.18.0-193.el8.x86_64.conf
/etc/chrony.conf
/etc/dracut.conf
/etc/fprintd.conf
/etc/host.conf
/etc/idmapd.conf
/etc/kdump.conf
/etc/krb5.conf
1.2 find
find:在目录层次结构中搜索文件(精确查找)
find的工作机制使得它可以完成实时查找,而且拥有很多查询条件,实现各种方式查找
格式:
find [OPTION]... [查找路径] [查找条件] [处理动作]
1.2.1 指定搜索目录层级
-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度
范例:
[root@centos8 data]# find /data -maxdepth 1
1.2.2 根据文件名和inode查找
- -name "文件名称":支持使用glob,如:*, ?, [], [^],通配符要加双引号引起来
- -iname "文件名称":不区分字母大小写
- -inum n 按inode号查找
- -samefile name 相同inode号的文件
- -links n 链接数为n的文件
- -regex “PATTERN”:以PATTERN匹配整个文件路径,而非文件名称
范例:
[root@centos8 data]# find /data -name 1.txt
/data/script/level2/1.txt
/data/1.txt
[root@centos8 data]# find /data -name "*.txt"
/data/lx.txt
/data/script/level2/1.txt
/data/1.txt
/data/2.txt
/data/3.txt
[root@centos8 data]# ll -i
830873 -rw-r--r-- 2 root root 0 Jan 14 17:23 1.txt
830875 -rw-r--r-- 1 root root 0 Jan 14 17:23 3.txt
830873 -rw-r--r-- 2 root root 0 Jan 14 17:23 9.txt
[root@centos8 data]# find /data/ -samefile 1.txt
/data/1.txt
/data/9.txt
1.2.3 根据属主、属组查找
- -user USERNAME:查找属主为指定用户(UID)的文件
- -group GRPNAME: 查找属组为指定组(GID)的文件
- -uid UserID:查找属主为指定的UID号的文件
- -gid GroupID:查找属组为指定的GID号的文件
- -nouser:查找没有属主的文件
- -nogroup:查找没有属组的文件
1.2.4 根据文件类型查找
-
-type TYPE
TYPE可以是以下形式: f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
范例:
[root@centos8 data]# find /data/ -type d
/data/
/data/script
/data/script/level2
/data/test
1.2.5 空文件或目录
- -empty
范例:
[root@centos8 data]# find /data -type d -empty
/data/test
/data/empty
1.2.6 组合条件查询
- 与:-a ,默认多个条件是与关系
- 或:-o
- 非:-not !
小技巧
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
范例:
[root@centos8 data]# find /data -type d -empty
/data/test
/data/empty
[root@centos8 data]# find /data -type d -a -empty
/data/test
/data/empty
[root@centos8 data]# find /data ! \( -type f -o -empty \)
/data
/data/script
/data/script/level2
1.2.7 排除目录
- -path pattern 只查找pattern目录,不展示工作树
- -prune 配合-path选项排除目录
格式
find [查找目录] -path '排除目录' -prune -o [查找条件] -print
范例:
[root@centos8 data]# find /data -path '/data/script'
/data/script
[root@centos8 data]# find /data -path '/data/script' -prune -o -print
/data
/data/systeminfo.sh
/data/arg.sh
#查找/data下,除test和script目录的其它所有目录
[root@Zabbix-MySql data]# ll
总用量 0
-rw-r--r-- 1 root root 0 1月 16 11:31 1.txt
-rw-r--r-- 1 root root 0 1月 16 11:31 2.txt
-rw-r--r-- 1 root root 0 1月 16 11:31 3.txt
drwxr-xr-x 2 root root 6 1月 16 11:30 empty
drwxr-xr-x 2 root root 6 1月 16 11:30 script
drwxr-xr-x 2 root root 6 1月 16 11:30 test
[root@Zabbix-MySql data]# find /data \( -path '/data/test' -o -path '/data/script' \) -a -prune -o -type d -print
/data
/data/empty
1.2.8 根据文件大小来查找
-
-size [+|-]#UNIT
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)
范例:
find / -size +10G
1.2.9 根据时间戳
以“天”为单位
-
-atime [+|-]#
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-
-mtime [+|-]#
-
-ctime [+|-]#
以“分钟”为单位
- -amin [+|-]#
- -mmin [+|-]#
- -cmin [+|-]#
1.2.10 根据权限查找
-
-perm [/ | -]MODE
MODE:精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系
-MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
范例:
[root@centos8 data]# find /data/ -perm -7000 -ls
830873 0 ---S--S--T 1 root root 0 Jan 14 17:23 /data/1.txt
[root@centos8 data]# ll 1.txt 2.txt
---S--S--T 1 root root 0 Jan 14 17:23 1.txt
---S--S--- 1 root root 0 Jan 14 17:23 2.txt
[root@centos8 data]# find /data/ -perm /7000 -ls
830873 0 ---S--S--T 1 root root 0 Jan 14 17:23 /data/1.txt
830874 0 ---S--S--- 1 root root 0 Jan 14 17:23 /data/2.txt
1.2.11 处理动作
- -print:默认的处理动作,显示至屏幕
- -ls:类似于对查找到的文件执行“ls -l”命令
- -fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于 -ls > file
- -delete:删除查找到的文件,慎用!
- -ok COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
- -exec COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令
- {}: 用于引用查找到的文件名称自身
范例:
#找到data目录.conf结尾文件,并备份为.bak结尾文件
[root@Zabbix-MySql data]#find /data -name "*.conf" -exec cp {} {}.bak \;
[root@Zabbix-MySql data]#ll
-rw-r--r-- 1 root root 0 1月 16 15:26 lx.conf
-rw-r--r-- 1 root root 0 1月 16 16:00 lx.conf.bak
练习:
1.查找/etc目录下大于1M且类型未普通文件的所有文件
[root@centos8 data]# find /etc -size +1M -type f
/etc/selinux/targeted/policy/policy.31
/etc/udev/hwdb.bin
2.查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件或目录
[root@centos8 data]# find / -nouser -o -nogroup -a -atime -7 \( -type f -o -type d \)
/var/spool/mail/mandriva
/home/mandriva
/home/mandriva/.bash_logout
/home/mandriva/.bash_profile
/home/mandriva/.bashrc
3.查找/etc目录下至少有一类用户没有执行权限的文件
[root@centos8 data]# find /etc/ ! -perm -111 -a -type f -ls
1.3 xargs
xargs:xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为参数。xargs用于产生某个命令的参数
常见选项:
- -n max-args 每一行包含max-args个参数
find 和 xargs 的组合使用:
find | xargs COMMAND
范例:
#查找.txt结尾文件按照大小对文件排序
[root@Zabbix-MySql data]#find -name "*.txt" | xargs ls -Sl
-rw-r--r-- 1 root root 7 1月 16 16:16 ./3.txt
-rw-r--r-- 1 root root 4 1月 16 16:17 ./1.txt
-rw-r--r-- 1 root root 0 1月 16 11:31 ./2.txt
[root@Zabbix-MySql data]#echo {1..10} | xargs -n2
1 2
3 4
5 6
7 8
9 10
#批量创建用户
[root@centos8 data]# echo user{1..10} | xargs -n1 useradd
2 压缩和解压缩
2.1 compress
compress:由于压缩比比其他软件底,不常用
格式
compress Options [file ...]
uncompress file.Z #解压缩
常用选项:
- -d 解压缩,相当于uncompress
- -c 结果输出至标准输出,不删除原文件
- -v 显示解压缩过程
2.2 gzip
格式:
gzip [OPTION]... FILE ...
常用选项:
- -k keep, 保留原文件,CentOS 8 新特性
- -d 解压缩,相当于gunzip
- -c 结果输出至标准输出,保留原文件不改变
- -# 指定压缩比,#取值为1-9,值越大压缩比越大
范例:
[root@centos8 data]# gzip -k message
[root@centos8 data]# ll
-rw------- 1 root root 15366 Jan 16 18:00 message.gz
#不解压查看压缩文件内容
zcat 作用等同于 gunzip -c
#高级用法
#压缩多个文件
cat file1 file2 | gzip > foo.gz
gzip -c file1 file2 > foo.gz
2.3 bzip2和bunzip2
格式:
bzip2 [OPTION]... FILE ...
常用选项:
- -k keep, 保留原文件
- -d 解压缩
- -c 结果输出至标准输出,保留原文件不改变
- -# 1-9,压缩比,默认为9
范例:
[root@centos8 data]# bzip2 -k message
[root@centos8 data]# ll
-rw------- 1 root root 8955 Jan 16 18:00 message.bz2
bzcat file.bz2 不解压缩的前提下查看文本文件内容
2.4 xz和unxz
格式:
xz [OPTION]... FILE ...
常用选项:
- -k keep, 保留原文件
- -d 解压缩
- -c 结果输出至标准输出,保留原文件不改变
- -# 压缩比,取值1-9,默认为6
范例:
[root@centos8 data]# xz message
[root@centos8 data]# ll
-rw------- 1 root root 8060 Jan 16 18:00 message.xz
unxz file.xz 解压缩
xzcat file.xz 不显式解压缩的前提下查看文本文件内容
2.5 zip和unzip
zip 不同之处在于可以实现打包目录,不加选项实现多个文件压缩,但可能回丢失文件属性信息,如:属主和属组等
格式
zip [OPTION] [zipfile [file ...]]
常见选项:
- -r 打包整个目录内容
- -d 指定路径
范例:
[root@centos8 home]# zip -r /data/home.zip /home/
[root@centos8 data]# ll
-rw-r--r-- 1 root root 3302361 Jan 16 18:41 home.zip
#解压缩至指定目录,如果指定目录不存在,会在其父目录(必须事先存在)下自动生成
unzip /backup/sysconfig.zip -d /tmp/config
#-p 表示管道
unzip -p message.zip > message
3 打包和解包
3.1 tar
可以对目录和多个文件打包一个文件,并且可以压缩,保留文件属性不 丢失
格式:
tar [OPTION]... FILE ...
常见选项:
- -c 打包
- -f 指定文件名
- -v 显示打包过程
- -x 解包
- -t 预览
- -C 指定解包目录
- --exclude 排除文件
- -r 追加文件至归档
- -T 指定要打包的文件
- -X 指定排除在打包外的文件
范例:
[root@centos8 data]# tar -cf message1.tar message1 home.zip
[root@centos8 data]# tar -tf message1.tar
message1
home.zip
[root@centos8 data]# tar -xf message1.tar
[root@centos8 data]# ll
drwxr-xr-x 5 root root 50 Jan 16 18:59 home
-rw------- 1 root root 10240 Jan 16 20:05 message1
#结合压缩工具实现:归档并压缩
-z 相当于gzip压缩工具
-j 相当于bzip2压缩工具
-J 相当于xz压缩工具
[root@centos8 data]# tar -zcf message.tar.gz message1 home.zip
[root@centos8 data]# ll
-rw-r--r-- 1 root root 3226623 Jan 16 20:13 message.tar.gz
#利用 tar 进行文件复制(速度比cp命令稍快)
[root@centos8 ~]#tar c /data/ | tar x -C /backup
tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist
tar zcvf /root/a.tgz --exclude=/app/host1 --exclude=/app/host2 /app
3.2 split
分割一个文件为多个文件
格式:
split [OPTION]... [FILE [PREFIX]]
常见选项:
- -b 指定分割文件的大小
- -d 使用从0开始的数字后缀,而不是字母
范例:
[root@centos8 data]# split -b 1M message1.tar /data/home/message
[root@centos8 data]# ll home
-rw-r--r-- 1 root root 1048576 Jan 16 23:33 messageaa
-rw-r--r-- 1 root root 1048576 Jan 16 23:33 messageab
-rw-r--r-- 1 root root 1048576 Jan 16 23:33 messageac
-rw-r--r-- 1 root root 172032 Jan 16 23:33 messagead
#将多个文件合并成一个文件
[root@centos8 data]# cat ./home/messagea* > message.tar
[root@centos8 data]# ll
-rw-r--r-- 1 root root 3317760 Jan 16 23:36 message.tar
练习:
1.打包/etc目录下所有conf结尾的文件,压缩包名称未当天的时间,并拷贝到/usr/local/src目录备份
[root@centos8 data]# tar -zcvf /usr/local/src/`date +%F`.tar.gz /etc/*.conf
[root@centos8 data]# ll /usr/local/src/
-rw-r--r-- 1 root root 37802 Jan 19 16:43 2021-01-19.tar.gz