文件查找与打包

一、文件查找

  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