2.3.2 查找文件我最强:find
2.3.2.1 find查找常用命令示例
find / -name 'wfy.txt'
# 从根目录下开始查找文件wfy.txt
find . -name '*fy.txt'
# 当前目录下,查找fy.txt后缀的文件
# “.”表示当前目录,"*"表示任意长度字符
find / -type f -size +500M
# 从根目录开始查找,500M以上文件
# / :根目录
# . : 当前目录
# -type f: f为普通文件类型,f改为d则是目录文件,l则是符号链接文件,-type 还有其他参数,不在这里一一列举
# -size +500M :500MB以上
# 一般磁盘空间不够,删除垃圾文件时会使用到此命令
find . -type f -size +1k
# 查找当前文件夹下超过1k的文件,注意k是小写。
find . -type f -mtime -30
# 查找当前目录下30天之内修改过的文件
# -mtime:代表修改时间,最常用,类似参数有-atime、-ctime
# -atime:代表访问时间,查看过就算
# -ctime:文件状态改变时间
# -30:代表30天以内,30为n,数字自己填写
# +30:30天以前
# 30:距今第30天
find /var/log/ -mtime +30 -name '*.log'
# 查找指定目录/var/log/ 下30天以前的log文件
find /etc ! -type f
# 查找 /etc 目录下不是普通文件的 文件
# "!":感叹号,取反
find /etc ! -type l -mtime -30
# 查找/etc 目录下不是符号链接文件,并在30天内被修改过的文件
find /etc -maxdepth 1 ! -type l -mtime -30
# 查找/etc 第一层目录下不是符号链接文件的文件,并在30天内被修改过
# -maxdepth : 前面du学过,指定目录层级,-maxdepth 1代表第1层,-maxdepth 2代表延伸到第二层
-maxdepth 可能有点不好理解,所以截了个示例图
2.3.2.2 使用find 组合命令:统计与删除
基本常用的find命令都已经讲完了,再说下运维中可能常用的一个组合命令,利用find删除N天以前的文件或日志。
先用wc -l来统计下log数量,再删除看看
find / -name '*.log' -mtime +300 | wc -l
# 从根目录下开始搜索300天之前的log文件,并统计数量
# “|”:管道符,将前面查到的数据作为输入源给后面的命令
第一种删除方式:-exec
find / -name '*.log' -mtime +300 -exec rm {} \;
# 查找30天以前的log文件,使用-exec加rm将其删除
# 再使用上面的命令重新查看一次
find / -name '*.log' -mtime +300 | wc -l
第二种删除方式:-ok
find / -name '*.log' -mtime +200 -ok rm {} \;
# -ok : 询问删除,y删除,n不删除,回车默认不删除
第三种删除方式:xargs
依次执行查看结果
find / -name '*.log' -mtime +100 | wc -l
find / -name '*.log' -mtime +100 | xargs rm -f
# xargs : 命令传递参数过滤器,与管道符“|”一同使用,将前面的命令传递给后面的命令使用
find / -name '*.log' -mtime +100 | wc -l
2.3.2.3 find与xargs的组合使用
对于50天前的log文件进行详情查看
find / -name '*.log' -mtime +50 | xargs ls -l
# 利用xargs + ls -l 命令来进行文件的详细属性查看
移除50天前的文件
mkdir /logback
# 创建根目录下的 /logback文件夹
find / -name '*.log' -mtime +50 | xargs -i mv {} /logback
# 将50天前的所有log文件移动到 /logback 文件夹下
# xargs -i + {},将前面查找到的文件都作为参数给mv命令执行
ls -l /logback
# 查看 /logback 下所有文件详情
2.3.2.4 find下xargs与exec的区别
区别一:
-exec,是将查找到的结果文件名逐个传递给后面的命令执行,文件多会导致效率低;
xargs,则是一次性传递,效率较高,并可使用-n参数控制传递文件个数。
区别二:
-exec,文件名有空格等特殊字符也照常处理;
xargs,处理特殊的文件名(例如文件名有空格)需要采用特殊的处理方式(find . -name "*edu" -pringt0| xargs -0 ls -l)
验证区别一,示例如下:
find /logback -name '*.log' -exec echo yaomaomao {} \;
find /logback -name '*.log' | xargs echo yaomaomao
可以看到使用-exec每次获得一个文件输出一次,xargs则只输出了一行。
xargs还可以用-n参数控制每次输出的文件个数
find /logback -name '*.log' | xargs -n5 echo yaomaomao
可以看到,每行输出5个参数(文件名),不足的行输出剩下的。
验证区别二,示例如下:
touch yaomaomao.txt;touch "yaomaomao centOS 7";ll yaomaomao*
# 小技巧:使用“;”分号可以一次性执行多个命令
# 注意:查看和创建带有空格的文件时,使用引号括起来
find . -name "yaomaomao*" -exec ls -lh {} \;
# 正常查找出来
find . -name "yaomaomao*" | xargs ls -lh
# 可以看到使用此命令报找不到那个文件或目录
find . -name "yaomaomao*" -print0 | xargs -0 ls -lh
# 正常查找
其实find还有很多强大的功能,截两张图大家就知道了
这本书就是我开头推荐的《核心系统命令实战》。
公众号注册的比较晚,没有评论功能,所以一般用来发长文。
知识星球相当于技术朋友圈,有问题大家可以提问,讨论。
欢迎关注我的公众号:姚毛毛的博客
欢迎加入我的知识星球,目前免费哦。
知识星球:姚毛毛的私密花园