Linux的Find下令

[复制链接]
发表于 2026-10-3 22:40:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
\

find 是 Linux 里最实用的文件查找命令,但它真正强大的地方不在「按名字找」,而在「按条件组合找 + 直接处理」。这篇从常用范例讲起,把 -name、-size、-user、-type、多条件组合、时间戳和 -exec 处理动作全部过一遍,再给几个生产环境里直接能用的例子。

一、基本格式

find 的语法是 find 查找范围 范例 查找数据,注意三个部分都要有,范围是必填的(不给默认是当前目录)。

二、常用查找范例

  • 按名称查找:-name,根据目标文件名称查找,允许使用 * 和 ? 通配符。
  • 按文件大小查找:-size,用 +、- 设置超过或小于指定大小,常用单位 kB(k 是小写)、MB、GB。
  • 按属主查找:-user,根据文件是否属于某个用户查找。
  • 按文件类型查找:-type,常用类型有普通文件(f)、目录(d)、块设备文件(b)、字符设备文件(c)。

三、参数实战

3.1 -name 通配符

find /data/ -name "*.txt"     # 查 /data/ 下以 .txt 结尾的文件
find /data/ -name "[A-Z]*"    # 查以大写字母开头的文件
find /data/ -name "test*"     # 查以 test 开头的文件

3.2 -size 大小过滤

find /data/ -size +1M         # 大于 1MB 的文件
find /data/ -size 1M          # 正好 1MB 的文件
find /data/ -size -1M         # 小于 1MB 的文件

想造一个指定大小的文件做测试,可以用 dd(复制转换工具):if=/dev/zero 表示输入用 /dev/zero(只生成 0 字节的空字符流),of=ceshi.txt 指定输出文件,bs=10M 设块大小 10MB,count=1 只复制一个块——一次就得到 10MB 的测试文件,用来测磁盘空间非常好用。

3.3 -user 属主过滤

find /home -user 用户名
find /home -user 用户名 -group 组名

3.4 -type 类型过滤

find /data/ -type d    # 只找目录
find /data/ ! -type d  # 找非目录
find /data/ -type l    # 找链接文件
find /data/ -type d | xargs chmod 755 -R   # 目录权限改 755
find /data/ -type f | xargs chmod 644 -R   # 文件权限改 644

文件类型还有:块设备文件(b)指硬盘、SSD 这类存储设备;字符设备文件(c)指按字符为单位传输的设备,如键盘、鼠标、串口、打印机。字符设备通常不带缓冲区、不支持随机存取,读写是实时的、按字符流有序访问。

四、xargs:把 find 的结果喂给别的命令

xargs 是给其他命令传递参数的过滤器,也是组合多个命令的工具,它擅长把标准输入转换成命令行参数。为什么需要它?因为 chmod 这类命令不是管道命令,读不了标准输入,加上 xargs 就行。

find ./ -maxdepth 1 -type f -print0 | xargs -0 ls -lh

拆开看:find ./ 从当前目录开始搜;-maxdepth 1 限制深度为 1,只看当前目录不进子目录;-type f 只要文件;-print0 用 0 而不是换行或空格做分隔符,对付带空格、引号、换行的文件名。右边 | 是管道,xargs -0 告诉它输入项由 0 分隔(和 find 的 -print0 配对),ls -lh 里 -l 是长格式、-h 是人类可读大小。这样即使文件名很怪,命令也能正确处理。

五、多条件组合

  • -a:并且(两个条件同时满足)。
  • -o:或者(满足任一即可)。
  • !:取反。
find /mnt -user root -a -size +5m
find /mnt -user root -o -size +5m

注意优先级:-a 高于 -o,和编程语言里的与或非一样;拿不准就加括号。

六、空文件与时间戳

6.1 空文件

-empty 用来找空文件(大小为 0 的文件或空目录),清垃圾时很好使。

6.2 三个时间戳

  • atime(访问时间):最后一次读取文件内容的时间。仅读内容时才更新,ls 读元数据通常不算;有的文件系统会用 noatime 或 relatime 挂选项禁用 atime 更新以减少磁盘 I/O。
  • mtime(修改时间):最后一次修改文件内容的时间。内容一改就更新,是最常用于追踪内容变化的那个。
  • ctime(状态改变时间):最后一次更改文件状态(inode 信息)的时间。不只内容改会更新,权限、所有权变化也会更新,即使内容没变。

另外 -min 不是独立时间戳,而是「以分钟指定时间范围」的参数,通常和 -atime/-mtime/-ctime 搭配用,比如 find /path -mmin -5 找最近 5 分钟内改过的文件(文章里写成 -mtime-5 那种是常见笔误,按分钟用 -mmin,按天用 -mtime)。

七、-exec 处理动作

按权限查找用 -perm:find /bin -perm 755 找权限正好是 0755 的,`find /bin -perm -644` 找至少 644 权限的。真正干活靠 -exec:

find ./ -name "*.txt" -exec rm {} \;        # 删掉所有 txt(含子目录)
find ./ -name "*.txt" -exec grep "bin" {} \;  # 找出含 "bin" 的行

注意 {} 中间有空格,结尾的 \; 里分号要转义,否则 shell 会当成命令结束。

八、生产环境实例

find /backup/ -type f -name "*.log" -exec rm {} \;
find /backup/ -type f -name "*.dmp" -exec rm {} \;
find /backup/ -type f -name "*.tar.gz" -mtime +5 -exec rm -rf {} \;

第三行是清理 5 天前的备份:先 -type f 限定文件类型,-mtime +5 限定超过 5 天,再 -exec rm -rf 删掉。

九、最容易踩的坑

  • 没加 -type f 就删 .log 风格的通配符:万一目录也叫 x.log,被删掉就麻烦了。凡是要删名字符合某种模式的东西,一律先补 -type f。
  • 删之前先跑一次不带 -exec 的命令看输出,确认命中列表再动手。
  • 大目录上 find 全量扫会很慢,能用 -maxdepth 限深的就限,能用具体路径就别从 / 开始。

find 的进阶思路就一条:先用条件把范围收窄,再用 -exec 或管道把结果交给真正干活的命令。练熟这句式,文件批量处理基本不用手写脚本。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表