Linux文件查找:从locate到find的进阶指南
在Linux系统中,查找文件是日常高频操作。今天我们就来聊聊两个经典的查找工具:locate和find。前者像懒人神器,后者像瑞士军刀。我们重点解剖find,让你彻底掌握它的精髓。
一、locate:快但依赖索引
locate之所以快,是因为它不扫描磁盘,而是查询预先构建好的数据库(通常由系统定时任务自动更新)。你也可以手动运行updatedb刷新索引。
优点:秒出结果,适合模糊查找。
缺点:非实时,刚创建的文件可能找不到;只能按文件名匹配。
常用选项:
-
-b:只匹配路径中的基名(文件名部分) -
-c:统计匹配数量 -
-r:支持基本正则表达式
示例:
locate -b '\passwd' # 查找所有名为 passwd 的文件
locate -c '*.conf' # 统计有多少 .conf 文件
不过,locate功能有限,真正的重头戏是find。
二、find:实时、精准、强大
find通过遍历指定目录树来实时查找,虽然比locate慢一点,但胜在精确、灵活,支持各种条件组合。
基本用法
find [起始路径] [查找条件] [处理动作]
-
起始路径:默认当前目录
-
查找条件:按文件名、大小、类型、权限、时间等筛选
-
处理动作:默认打印,也可执行删除、复制等操作
1. 按文件名查找
-
-name "pattern":区分大小写,支持通配符(*,?,[]) -
-iname "pattern":忽略大小写 -
-regex pattern:按正则匹配完整路径(很少用)
find /etc -name "*.conf"
find /home -iname "readme*"
2. 按文件类型查找
-type后面跟类型标识:
-
f:普通文件 -
d:目录 -
l:符号链接 -
b:块设备 -
c:字符设备 -
p:管道 -
s:套接字
find /dev -type b # 找块设备
find /var -type d -name "log" # 找名为 log 的目录
3. 按从属关系查找
-
-user username:属主 -
-group groupname:属组 -
-uid UID/-gid GID -
-nouser:无属主(孤儿文件) -
-nogroup:无属组
find / -nouser -o -nogroup # 找孤儿文件
find /home -user alice # 找 alice 的文件
4. 按文件大小查找
-size [+|-]n[单位]
常用单位:c(字节)、k、M、G
-
n:匹配大小为(n-1, n]区间 -
-n:匹配[0, n-1] -
+n:匹配(n, ∞)
find /var -size +100M # 大于100MB
find /etc -size -1k # 小于1KB
find . -size 1024c # 恰好1024字节
5. 按时间戳查找
Linux文件有三个时间:
-
atime:访问时间 -
mtime:修改时间(内容) -
ctime:改变时间(属性或内容)
以“天”为单位:-atime, -mtime, -ctime
以“分钟”为单位:-amin, -mmin, -cmin
数值含义(以-atime为例):
-
-atime 5:距今第5~6天前被访问(即刚好过了5个完整周期) -
-atime -5:距今5天内被访问(含第5天当天) -
-atime +5:距今6天前及更早被访问
find /tmp -atime +30 # 30天未访问的文件
find /etc -mtime -7 # 最近7天修改过的文件
find /var -cmin -60 # 最近1小时内属性改变的文件
6. 按权限查找
-perm [/|-]mode
-
-perm mode:精确匹配(权限完全等于mode) -
-perm /mode:任意一类用户的任意一位匹配即满足(或关系),0表示忽略 -
-perm -mode:每类用户的每一位都必须满足(与关系)
find /bin -perm 755 # 权限正好是755
find /etc -perm /222 # 任何人可写(任意用户有写权限)
find /usr -perm -4000 # 设置了SUID(setuid位)
理解技巧:
-
/是“只要有就行”(或) -
-是“全部都要有”(与)
7. 组合条件:与、或、非
-
-a(默认):与 -
-o:或 -
!或-not:非
优先级:! > -a > -o,可用圆括号改变顺序(需转义或加引号)。
# 找出 /tmp 下属主非 root 且文件名不含 fstab 的文件
find /tmp ! \( -user root -o -name "*fstab*" \) -ls
这里用到了德摩根定律:!A AND !B = !(A OR B),很实用。
三、处理动作:不只是看看
find找到文件后,可以对它们做点什么:
|
动作
|
说明
|
| --- | --- |
|
-print
|
默认,打印路径
|
|
-ls
|
类似 ls -l 详细列表
|
|
-delete
|
删除匹配的文件
|
|
-fls file
|
将长格式信息保存到文件
|
|
-ok command {} \;
|
执行命令,每次询问
|
|
-exec command {} \;
|
执行命令,不询问
|
{}代表当前找到的文件路径,\;表示命令结束(分号需转义)。
find /tmp -name "*.tmp" -delete # 删除临时文件
find /var/log -name "*.log" -exec gzip {} \; # 压缩日志
find /home -empty -ok rm {} \; # 删除空文件前确认
注意:-exec会将所有匹配结果一次性传递给命令,如果文件过多可能导致参数过长。可以用xargs分批处理:
find /var -type f -name "*.log" | xargs -n 10 gzip
xargs常用选项:
-
-n N:每次最多传N个参数 -
-d delim:自定义分隔符(默认空格/换行) -
-I str:用占位符替换参数位置(比如mv {} {}.bak) -
-P N:并行执行N个进程 -
-t:先打印再执行(调试用)
find . -name "*.jpg" | xargs -I {} cp {} /backup/
find . -name "*.txt" | xargs -P 4 gzip # 4线程压缩
四、实战练习(附答案)
-
查找 /var 下属主为 root、属组为 mail 的文件或目录
find /var -user root -group mail -
查找 /usr 下不属于 root、bin、hadoop 的文件或目录(两种方法)
find /usr ! \( -user root -o -user bin -o -user hadoop \) find /usr ! -user root ! -user bin ! -user hadoop -
查找 /etc 下最近一周内容修改过,且属主不是 root 也不是 hadoop 的文件或目录
find /etc -mtime -7 ! \( -user root -o -user hadoop \) -
查找系统上没有属主或属组,且最近一周内被访问过的文件或目录
find / \( -nouser -o -nogroup \) -atime -7 -
查找 /etc 下大于1M的普通文件
find /etc -size +1M -type f -
查找 /etc 下所有用户都没有写权限的文件
find /etc -type f ! -perm /222 -
查找 /etc 下至少有一类用户没有执行权限的文件
find /etc -type f ! -perm -111 -
查找 /etc/init.d 下所有用户都有执行权限,且其他人有写权限的文件
find /etc/init.d -type f -perm -113
五、总结
-
locate:快,但依赖索引,适合模糊查找文件名。 -
find:实时、精准、条件丰富,配合-exec或xargs能完成复杂任务。
掌握find就像拥有了一把文件系统的瑞士军刀。多练几次,你就能在茫茫文件海中精准定位目标。下次遇到“找不到文件”的情况,别再ls -R了,试试find吧!

浙公网安备 33010602011771号