简介
find
命令是 Linux 系统中用于查找文件的强大工具。它可以根据文件名、文件类型、文件大小、文件权限、修改时间等多种条件进行查找,并支持对匹配到的文件执行各种操作。
命令格式
find [查找路径] [查找条件] [动作]
查找路径
: 指定要查找文件的目录,可以是多个目录,用空格分隔。如果省略查找路径
,则默认为当前目录。查找条件
: 用于指定查找文件的条件,可以是多个条件,用-and
或-or
连接。动作
: 用于对匹配到的文件执行的操作,常见操作包括:-print
: 显示匹配到的文件路径-delete
: 删除匹配到的文件-exec
: 对匹配到的文件执行命令
常用参数
-name
: 按照文件名查找文件,支持通配符-type
: 按照文件类型查找文件,常见类型包括:f
: 普通文件d
: 目录l
: 符号链接s
: 套接字p
: 管道c
: 字符设备b
: 块设备
-size
: 按照文件大小查找文件,支持单位换算,例如:100k
: 查找大小为 100KB 的文件10M
: 查找大小为 10MB 的文件1G
: 查找大小为 1GB 的文件
-time
: 按照文件修改时间查找文件,支持单位换算,例如:-mtime +7
: 查找在过去 7 天内修改过的文件-atime -30
: 查找在过去 30 天内未访问过的文件-ctime +1
: 查找在 1 天前创建的文件
-perm
: 按照文件权限查找文件,例如:-perm 644
: 查找权限为 644 的文件-perm u=rwx,g=rx,o=
: 查找用户具有读写执行权限、组具有读执行权限、其他用户无权限的文件
-user
: 按照文件属主查找文件,例如:-user root
: 查找属主为 root 的文件-user zhangsan
: 查找属主为 zhangsan 的文件
-group
: 按照文件所属组查找文件,例如:-group staff
: 查找所属组为 staff 的文件-group root
: 查找所属组为 root 的文件
-depth
: 指定查找深度,例如:-maxdepth 2
: 只查找当前目录及其子目录中的文件,不查找子目录的子目录-mindepth 3
: 从第三层目录开始查找文件
命令用法
1. 查找当前目录下所有文件
find .
2. 查找当前目录及其子目录中所有名为 test.txt
的文件
find . -name test.txt
3. 查找当前目录及其子目录中所有大小为 100KB 的文件
find . -size 100k
4. 查找当前目录及其子目录中所有在过去 7 天内修改过的文件
find . -mtime +7
5. 查找当前目录及其子目录中所有权限为 644 的文件
find . -perm 644
6. 查找当前目录及其子目录中所有属主为 root 的文件
find . -user root
7. 查找当前目录及其子目录中所有所属组为 staff 的文件
find . -group staff
8. 只查找当前目录中的文件,不查找子目录中的文件
find . -maxdepth 1
9. 从第三层目录开始查找文件
find . -mindepth 3
10. 删除当前目录及其子目录中所有名为 test.txt
的文件
find . -name test.txt -delete
11. 将当前目录及其子目录中所有名为 test.txt
的文件的内容输出到 test.out
文件中
find . -name test.txt -exec cat {} > test.out \;
12. 在当前目录及其子目录中查找所有文件,并对每个文件执行 ls -l
命令
find . -exec ls -l {} \;
运维案例
案例一:查找系统中所有空文件
步骤
- 使用以下命令查找系统中所有空文件:
find / -type f -empty
结果
该命令将输出系统中所有空文件的路径。
案例二:查找系统中所有属主为 root 且权限为 644 的文件
步骤
- 使用以下命令查找系统中所有属主为 root 且权限为 644 的文件:
find / -user root -perm 644
结果
该命令将输出系统中所有属主为 root 且权限为 644 的文件的路径。
案例三:删除系统中所有名为 *.bak
的备份文件
步骤
- 使用以下命令删除系统中所有名为
*.bak
的备份文件:
find / -name "*.bak" -delete
结果
该命令将删除系统中所有名为 *.bak
的备份文件。
注意事项
- 使用
find
命令时,请谨慎使用-delete
等可执行动作,以免误删重要文件。 - 建议在使用
find
命令之前先备份重要文件。
脚本案例
清理日志目录并定时压缩日志的 Shell 脚本
脚本说明
该脚本用于清理日志目录 /var/log
中 7 天之前的日志压缩文件,并对 3 天之前的日志文件进行压缩。脚本会每天凌晨 3 点自动执行。
脚本内容
#!/bin/bash
# 设置日志目录
log_dir="/var/log"
# 设置保留天数
keep_days=7
# 计算几天前的日期
expire_date=$(date -d "-${keep_days} days")
# 清理过期日志压缩文件
find $log_dir -type f -name "*.gz" -mtime +${keep_days} -exec rm -rf {} \;
# 压缩 3 天前的日志文件
find $log_dir -type f -name "*.log" -mtime +${keep_days} -mtime -$((keep_days - 3)) -exec gzip -f {} \;
# 设置定时任务
crontab -l | {
echo "0 3 * * * $0"
} | crontab -
脚本用法
- 将上述脚本保存为
clean_log.sh
文件。 - 修改脚本中的
log_dir
变量为您的日志目录路径。 - 赋予脚本可执行权限:
chmod +x clean_log.sh
- 运行脚本:
./clean_log.sh
定时任务
该脚本已设置了定时任务,每天凌晨 3 点自动执行。您也可以根据需要修改定时任务的时间。
注意事项
- 请确保您有足够的权限执行该脚本。
- 脚本会删除 7 天之前的日志压缩文件,请谨慎使用。
- 脚本会压缩 3 天之前的日志文件,请确保您有足够的存储空间。
其他说明
- 您可以根据需要修改脚本中的
keep_days
变量,以更改保留天数。 - 您可以添加其他操作到脚本中,例如发送清理日志的通知邮件。
总结
find
命令是 Linux 系统中用于查找文件的强大工具,可以根据多种条件进行查找,并支持对匹配到的文件执行各种操作。掌握了 find
命令的使用方法,可以帮助运维人员快速定位和处理文件相关的问题。