一、文件查找
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