Linux文件查找:find和locate命令入门
服务器上找文件,不知道在哪个目录?
别一个个目录翻了,用find和locate命令快速定位。
find命令
find是最强大的查找命令,可以按各种条件搜索。
基本用法:
bash
find 目录 -name "文件名"
例子:
bash
# 在当前目录及子目录找所有.log文件
find . -name "*.log"
# 在/var目录找nginx.conf
find /var -name "nginx.conf"
# 忽略大小写
find /home -iname "readme.md"
按类型查找
bash
# 只找文件
find /var -type f -name "*.log"
# 只找目录
find /home -type d -name "config"
# 只找链接
find /usr -type l
类型参数:
- f:普通文件
- d:目录
- l:符号链接
按时间查找
bash
# 7天内修改过的文件
find /var/log -mtime -7
# 7天前修改的文件
find /var/log -mtime +7
# 最近24小时修改的文件
find /var/log -mtime 0
# 最近1小时修改的文件
find /var/log -mmin -60
时间参数:
- mtime:修改时间(天)
- mmin:修改时间(分钟)
- atime:访问时间
- ctime:状态改变时间
按大小查找
bash
# 大于100M的文件
find /home -size +100M
# 小于1M的文件
find /home -size -1M
# 刚好100M的文件
find /home -size 100M
# 找大文件并显示大小
find /home -size +100M -exec ls -lh {} \;
大小单位:
- c:字节
- k:KB
- M:MB
- G:GB
找到后执行操作
bash
# 删除7天前的日志
find /var/log -name "*.log" -mtime +7 -delete
# 修改权限
find /var/www -type f -exec chmod 644 {} \;
# 显示详细信息
find /home -name "*.txt" -exec ls -l {} \;
# 移动文件
find . -name "*.bak" -exec mv {} /backup/ \;
组合条件
bash
# 同时满足(-a 或直接连写)
find /var -name "*.log" -size +10M
# 满足其一(-o)
find /home -name "*.jpg" -o -name "*.png"
# 取反(!)
find /var -type f ! -name "*.log"
实用场景
找大文件清理磁盘:
bash
find / -type f -size +500M 2>/dev/null | head -20
找最近修改的文件:
bash
find /var/www -type f -mmin -30
清理临时文件:
bash
find /tmp -type f -mtime +3 -delete
批量改权限:
bash
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
locate命令
locate比find快很多,但需要先建立索引。
安装:
bash
# Ubuntu
apt install mlocate
# CentOS
yum install mlocate
更新索引:
bash
updatedb
使用:
bash
locate nginx.conf
几乎秒出结果,比find快得多。
缺点: 索引不是实时的,新文件可能搜不到,需要先updatedb。
find vs locate
| 特点 | find | locate |
|---|---|---|
| 速度 | 慢(实时搜索) | 快(查索引) |
| 实时性 | 实时 | 需要更新索引 |
| 条件 | 支持各种条件 | 只能按名称 |
| 操作 | 可以-exec执行操作 | 只能查找 |
选择:
- 知道大概位置,用find
- 全盘搜索文件名,用locate
- 需要按条件过滤,用find
- 需要对结果执行操作,用find
which和whereis
找命令在哪:
bash
# 找命令的位置
which nginx
# /usr/sbin/nginx
# 找命令、源码、手册的位置
whereis nginx
# nginx: /usr/sbin/nginx /etc/nginx /usr/share/man/man8/nginx.8.gz
远程文件搜索
有时候需要在多台服务器上找文件,我用星空组网把服务器连起来,批量搜索:
bash
for ip in 10.26.1.{10..15}; do
echo "=== $ip ==="
ssh root@$ip "find /var/log -name 'error.log' -size +100M"
done
比一台台登录快多了。
命令速查
| 场景 | 命令 |
|---|---|
| 按名称找 | find /path -name "*.log" |
| 按大小找 | find /path -size +100M |
| 按时间找 | find /path -mtime -7 |
| 只找文件 | find /path -type f |
| 只找目录 | find /path -type d |
| 找到后删除 | find /path -name "*.tmp" -delete |
| 快速定位 | locate 文件名 |
小结
find命令核心用法:
bash
find 目录 -name "名称" -type 类型 -size 大小 -mtime 时间 -exec 操作 {} \;
记住最常用的几个参数就够日常用了。
有问题评论区交流~