首页 > 技术文章 > 8.文件查找和软件解压缩

bestvae 2021-01-19 16:46 原文

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

推荐阅读