• 文件查找与打包


    一、文件查找

      grep:文件内容过滤。不知道文件名,但是知道文件里面的一段内容。

      find:文件查找,针对文件名

    1.1 命令文件查找

      查找系统命令的所在位置,非常快速。是从环境变量定义的路径下查找

    which ls //从 PATH 环境变量 ( echo $PATH) 

    [root@hui36 lh]# echo $PATH
      /sbin:/bin:/usr/sbin:/usr/bin
    

    1.2 任意文件查找

      一般我们查找都是查找文件的,而不是查找命令。

    1.2.1 locate

      是一种基于数据库的查找方式(/var/lib/mlocate/mlocate.db),查找手段比较单一,无法根据文件大小,创建日期等等来查找。

      计划任务:每天自动更新数据库 /etc/cron.daily/mlocate.cron

      我们可以手动更新:updatedb

      如果我们不更新,找不到刚创建的文件或找到已经删除的文件。

    [root@hui36 lh]# locate mlocate.db
    /usr/share/man/man5/mlocate.db.5.gz
    /var/lib/mlocate/mlocate.db
    /var/lib/mlocate/mlocate.db.eAiw03
    

    1.2.2 find

      强大的搜索工具,但是查找比较慢,会进行遍历。但是可以进行缩小目录。

    find [options]    [path...]       [expresson]    [action]

      选项    路径(可多个)   表达式    找到以后的动作 -print是默认的动作

      ----------------查找维度 expresson----------------

    =======按文件名查找
    find /etc -name "ifcfg-ens33"
    find /etc -iname "ifcfg-ens33"                     忽略大小写
    find /etc -iname "ifcfg-ens*"                       可以跟上正则
    find /home /etc /usr -name   "ifcfg-ens*"     多个路径
    
    =======按文件大小
    find /etc -size +5M       大于5M
    find /etc -size 5M        等于5M 
    find /etc -size -5M

    =======按时间(atime,mtime,ctime)
    find /etc -mtime +5 24*5 之前修改的文件
    find /etc -mtime +5 24*5 之前修改的文件
    find /etc -mtime 5 24*5 修改的文件

    =======知道查找目录深度
    -maxdepth 最大
    -mindepth 至少
    find / -maxdepth 3 -name "ifcfg-*"  找不到
    find / -maxdepth 4 -name "ifcfg-*"   找到

    =======根据属主、属组找:
    find /home -user jack
    find /home -group hr
    find /home -user jack -group hr    //默认之间就是-a(and)
    find /home -user jack -a -group hr
    find /home -user jack -o -group hr  //-o 或

    find /home -nouser
    find /home -nogroup
    find /home -nouser -o -nogroup
         #useradd lh001
         #userdel lh001 不加上-r 选项,家目录与邮件目录不会删除
         #find /home -nouser 就会存在了
         #find /home -nouser -delete 找到使用action进行删除

    ========根据文件类型
    find /dev -type d //d目录
    find /dev -type f  //f普通
    find /dev -type l  //链接
    find /dev -type b  //块设备
    find /dev -type c //字符设备
    find /dev -type s  //套接字文件
    find /dev -type p  //管道文件

    ========文件权限
    find . -perm 644  //精确匹配644
    find . -perm -644 //只要包含644的,777、677等都满足
    find /usr/bin /usr/sbin -perm -4000 -ls //000就是包含,不关心。包含 set uid ,具有提权的特性,非常危险。
    find /usr/bin /usr/sbin -perm -2000 -ls //包含 set gid
    find /usr/bin /usr/sbin -perm -1000 -ls //包含 sticky
    =========按照正则表达式
    find /etc -regex '.*ifcfg-enp0s25'
    find /etc -regex '.*ifcfg-enp0s[0-9]+'

    -----------找到之后的处理动作:actions(默认的动作-print)-----------

    -print     默认的,相当于ls
    -ls        相当于ll,但是无法加上我们的h参数
    -delete    删除,需要小心使用,无提示,直接删除
    -exec      后面跟上自定义的shell命令,无提示与确定。用这个比较多,用ok,当需要确认的东西太多,按死你呀。
    -ok        后面跟上自定义的shell命令,有提示与确定,(就算是强制的f,也会进行确认)
      
    [root@tianyun ~]# find /etc -name "ifcfg*" -print
    [root@tianyun ~]# find /etc -name "ifcfg*" -ls
    [root@tianyun ~]# find /etc -name "ifcfg*" -exec cp -rvf {} /tmp ;  用exec比较多,当文件太多,用ok按确认都按死你。。。。
                              -exec ; 是固定的格式。 {}代表接受前面的命令的找到的。 [root@tianyun ~]# find /etc -name "ifcfg*" -ok cp -rvf {} /tmp ;

     1.3 文件查找扩展

    1.3.1 xargs 

    [root@tianyun ~]# find . -name "yang*.txt" |xargs rm -rf
    [root@tianyun ~]# find /etc -name "ifcfg-eth0" |xargs -I {} cp -rf {} /var/tmp
    

    1.3.2 取反与合并

    ##############取反
    [root@tianyun ~]# mkdir dir1 [root@tianyun ~]# touch dir1/file{1..20} [root@tianyun ~]# find /root/dir1 -name "file5" [root@tianyun ~]# find /root/dir1 ! -name "file5" //取反
    ===================================================================
    ###############合并 [root@tianyun ~]# find /root/dir1 -name "file5" -o -name "file9" /root/dir1/file5 /root/dir1/file9 [root@tianyun ~]# find /root/dir1 -name "file5" -o -name "file9" -ls
    //会存在问题,默认是-print,-ls只会加在一个后面。只打印一个 1466515 0 -rw-r--r-- 1 root root 0 6 月 5 11:15 /root/dir1/file9
    ===========方法1:两者都加-ls
    [root@tianyun ~]# find /root/dir1 -name "file5" -ls -o -name "file9" -ls
    1466499 0 -rw-r--r-- 1 root root 0 6 月 5 11:15 /root/dir1/file5
    1466515 0 -rw-r--r-- 1 root root 0 6 月 5 11:15 /root/dir1/file9
    ===========方法2:合并起来
    [root@tianyun ~]# find /root/dir1 ( -name "file5" -o -name "file9" ) -ls  //()代表组合起来,代表转义
    -rw-r--r-- 1 root root 0 6 月 5 11:15 /root/dir1/file5
    -rw-r--r-- 1 root root 0 6 月 5 11:15 /root/dir1/file9

    [root@localhost ~]# find /root/dir1 ( -name "file5" -o -name "file9" ) -exec rm -rvf {} ;
    removed ‘/root/dir1/file5’ removed ‘/root/dir1/file9’

    1.3.3 习题

    1. 将/etc/中的所有目录(仅目录)复制到/tmp 下,目录结构不变
      方法1:存在问题如果文件太大,浪费时间
        cp /etc /tmp
        find /tmp/etc ! -type d -delete
      方法2:
        find /etc -type d exec mkdir /tmp/{} ;注意不能使用cp命令,使用这个就会拷贝文件。 遍历的时候,是广度优先,一层遍历好,再下一层,所以不用加 -p 命令
    2. 将/etc 目录复制到/var/tmp//var/tmp/etc 中的所有目录设置权限 777(仅目录) 将/var/tmp/etc 中所有文件权限设置为 666
      方法1:
        chmod -R a=rwX /var/tmp/etc
      方法2:
        find /var/tmp/etc/ -type d -exec chmod 777 {} ;
        find /var/tmp/etc/ ! -type d -exec chmod 666 {} ;
    3. 以下命令的区别是什么? [root@tianyun ~]# find /etc -name "ifcfg*" -exec rm -rf {} ; [root@tianyun ~]# find /etc -name "ifcfg*" -exec rm -rf {} +
        ;是找到一个文件就删除
        + 找到所有的,一次性统一操作,效率比较高。但不是所有的适用。

    二、打包与压缩

    file 用来查看文件类型,不根据文件类型来查看内容

    du -sh 查看文件大小

      为什么要使用压缩:

        1.方便文档管理

        2.节约存储空间

        2.在多个小文件传输的时候,非常耗时,如下

    [root@hui36 ~]# du -sh /etc
        37M     /etc
    [root@hui36 ~]# time scp -r /etc root@192.168.5.32:/tmp

    2.1 打包与压缩

      打包最好是针对文件夹,这样解开的时候,就是一个文件夹。

    参数:
        c     create创建一个包
        f      压缩后的文件名
        x     解压
        t      list 列出
    
    [root@hui36 ~]# tar -cf etc.tar /etc/         直接打包,也具有压缩功能
    [root@hui36 ~]# tar -czf etc.tar.gz /etc/     调用gzip 压缩比最小
    [root@hui36 ~]# tar -cjf etc.tar.bz2 /etc/    调用bz2 压缩比中等
    [root@hui36 ~]# tar -cJf etc.tar.xz /etc/     调用xz   压缩比最大
    压缩后的对比:
    ll -h etc.tar*

    2.2 解压与解包

    参数:

      x   解开

      C  指定解开到的目录

    tar   -tf             f还是跟我们打的包,t只是列出里面的文件名,并没有解开
    tar   -xf  xx.tar     推荐使用这种方式,自动去找压缩算法。使用对应的g,j,J的话 比较麻烦。甚至可以省去-

    案列:

      在nginx 官网复制下载链接。

      wget 链接下载

      tar xf nginx-1.12.2.tar.gz   

    2.3 实验

    2.3.1 实验1:mysql 物理备份及恢复(注意路径)

      1.环境准备

        [root@hui36 ~]# yum install mariadb-server.x86_64 

        [root@hui36 ~]# systemctl start mariadb.service 

        [root@hui36 ~]# mkdir /backup

      2.备份

        [root@hui36 ~]# tar -cjf /backup/mysql.tar.gz /var/lib/mysql/ 

        tar: 从成员名中删除开头的“/”

       3.还原

        [root@hui36 ~]# tar -xf /backup/mysql.tar.gz -C /   因为上面是绝对路径,所以直接解压到跟下

    =========================使用相对路径备份======================

        [root@hui36 mysql]# tar -cJf /backup/mysql.tar.xz *

        [root@hui36 mysql]# tar -xf /backup/mysql.tar.xz -C /var/lib/mysql/

     2.3.2 实验2 本机拷贝海量小文件

      host A /etc (海量小文件) --------> host A /tmp

    time tar -czf - /etc |tar -xzf - -C /tmp/  主要说明的是文件不落地以及为下个实验准备 ,使用小横杆 作为标识,在磁盘上不创建包,只在内存中,这里解压的时候要指定算法

    2.3,2 实验3 远程拷贝海量小文件

      海量小文件的压缩、解压 双方都要花费很长时间,不打包 又要花费很长时间。该如何处理呢?

    常规方法:有时候1个g大小的很多小文件,需要一天传输。

    [root@localhost ~]# scp -r /etc 172.16.20.21:/tmp

    牛车方法:使用nc与文件不落地(只在内存中操作)

    ==host B 监听端口==
    [root@hostb ~]# systemctl stop firewalld.service
    [root@hostb ~]# nc -l 8888 |tar -xzf - -C /tmp
    ==host A ==
    [root@localhost ~]# tar -czf - /etc | nc 172.16.20.21 8888
    tar: Removing leading `/' from member names
  • 相关阅读:
    getaddrinfo()函数详解
    nm 命令 程序符号信息查看
    C# WebRequest处理Https请求
    正则表达式
    poj2762 Going from u to v or from v to u?
    Coroutine,你究竟干了什么?
    介绍几篇很有意思的计算机科普文章
    1005 Number Sequence(HDU)
    为什么读大学时做学术比搞项目重要?
    gcc中-pthread和-lpthread的区别
  • 原文地址:https://www.cnblogs.com/louhui/p/8735624.html
Copyright © 2020-2023  润新知