Shell 四剑客之四:find 文件查找实战

find 是按条件找文件,配合 -exec 就是批量操作:找大文件、清旧日志、批量改权限、按时间归档,全靠它。这篇讲按名字时间找、-exec 与 xargs 和清理实战。

一、按名字、类型、时间找

# 按名字找(通配符要引起来,不然 shell 先展开了)
find /eda/proj -name "*.log"
find /eda/proj -name "core*" -o -name "*.tmp"

# 按类型找:f 普通文件,d 目录,l 软链接
find /eda/proj -type f -name "*.v"
find /eda/proj -type d -empty

# 按时间找:7 天前改过的,24 小时内新建的
find /eda/proj -mtime +7
find /eda/proj -mmin -60

# 按大小找:大于 100M 的文件
find /eda/proj -type f -size +100M

-mtime +7 是“7 天前”,-mtime -7 是“7 天内”,加减号别搞反。时间条件配 -name 一起用,先缩小范围再动手。

二、按权限、属主找

# 找权限是 777 的文件(太开放了)
find /eda/proj -type f -perm 777

# 找属主已经离职的用户的文件
find /eda/proj -user zhangsan

# 找没有属主的孤儿文件
find /eda/proj -nouser -o -nogroup

三、-exec 与 xargs:找到就动手

# 找到就删(先不加 -delete 演练一遍!)
find /tmp -type f -name "*.tmp" -mtime +7 -print
find /tmp -type f -name "*.tmp" -mtime +7 -delete

# -exec:对每个文件执行命令,{} 是文件名,\; 结束
find /eda/proj -type f -name "*.log" -exec gzip {} \;

# -exec 结尾用 +:把文件攒一批再执行,快得多
find /eda/proj -type f -name "*.log" -exec gzip {} +

# xargs:把 find 的结果拼成命令参数
find /eda/proj -type f -name "*.bak" | xargs rm -f

# 文件名带空格:-print0 配 xargs -0,用空字符分隔才安全
find /eda/proj -type f -name "*.tmp" -print0 | xargs -0 rm -f

-exec {} + 比 -exec {} \; 快得多,前者一批文件调一次命令,后者一个文件调一次。文件名带空格必须用 -print0 | xargs -0,不然带空格的文件名会被拆成两个。

四、实战:清理日志与临时文件

# 找最大的 10 个文件
find /eda/proj -type f -exec du -h {} + 2>/dev/null | sort -rh | head -10

# 清理 30 天前的回归临时目录(先看清单再删)
find /eda/proj/regress -type d -name "tmp*" -mtime +30 -print
find /eda/proj/regress -type d -name "tmp*" -mtime +30 -exec rm -rf {} +

# 压缩 7 天前的日志(不删,留着查)
find /var/log -type f -name "*.log" -mtime +7 -exec gzip {} +

# 找一周内被改过的大于 1G 的文件(谁在偷偷写大文件)
find /eda -type f -size +1G -mtime -7 -exec ls -lh {} +

五、坑

  • 先 -print 再 -delete:删除操作没有后悔药,先打印清单确认,再换成删除。
  • 通配符引起来:-name *.log 不加引号,shell 会先在当前目录展开,结果完全不是你想要的。
  • 别在 / 下乱用 -delete:路径写错一个字母就是灾难,重要目录先在测试目录演练。
  • 深度限制:目录太深用 -maxdepth 2 限制层级,不然整棵树扫下来很慢。

find 的定位是“文件系统的搜索引擎”:条件越准,结果越有用。找得到、看得清、删得稳,这三步养成习惯,磁盘满、临时文件堆积这类问题就不会半夜找上门。

发表回复

后才能评论