zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    nginx接收tcp请求转发server
    eclipse 配置github 提交代码
    eclipse安装JDK11
    java内存管理
    进程 线程 纤程 中断
    DCL单例为什么要加volatile
    如何清理history
    后置引用
    nc 工具使用
    ip_local_port_range 和 ip_local_reserved_ports
  • 原文地址:https://www.cnblogs.com/bestvae/p/14298746.html
Copyright © 2011-2022 走看看