简介

find 命令是 Linux 系统中用于查找文件的强大工具。它可以根据文件名、文件类型、文件大小、文件权限、修改时间等多种条件进行查找,并支持对匹配到的文件执行各种操作。

命令格式

find [查找路径] [查找条件] [动作]
  • 1.
  • 查找路径: 指定要查找文件的目录,可以是多个目录,用空格分隔。如果省略 查找路径,则默认为当前目录。
  • 查找条件: 用于指定查找文件的条件,可以是多个条件,用 -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 .
  • 1.

2. 查找当前目录及其子目录中所有名为 test.txt 的文件

find . -name test.txt
  • 1.

3. 查找当前目录及其子目录中所有大小为 100KB 的文件

find . -size 100k
  • 1.

4. 查找当前目录及其子目录中所有在过去 7 天内修改过的文件

find . -mtime +7
  • 1.

5. 查找当前目录及其子目录中所有权限为 644 的文件

find . -perm 644
  • 1.

6. 查找当前目录及其子目录中所有属主为 root 的文件

find . -user root
  • 1.

7. 查找当前目录及其子目录中所有所属组为 staff 的文件

find . -group staff
  • 1.

8. 只查找当前目录中的文件,不查找子目录中的文件

find . -maxdepth 1
  • 1.

9. 从第三层目录开始查找文件

find . -mindepth 3
  • 1.

10. 删除当前目录及其子目录中所有名为 test.txt 的文件

find . -name test.txt -delete
  • 1.

11. 将当前目录及其子目录中所有名为 test.txt 的文件的内容输出到 test.out 文件中

find . -name test.txt -exec cat {} > test.out \;
  • 1.

12. 在当前目录及其子目录中查找所有文件,并对每个文件执行 ls -l 命令

find . -exec ls -l {} \;
  • 1.

运维案例

案例一:查找系统中所有空文件

步骤

  1. 使用以下命令查找系统中所有空文件:
find / -type f -empty
  • 1.

结果

该命令将输出系统中所有空文件的路径。

案例二:查找系统中所有属主为 root 且权限为 644 的文件

步骤

  1. 使用以下命令查找系统中所有属主为 root 且权限为 644 的文件:
find / -user root -perm 644
  • 1.

结果

该命令将输出系统中所有属主为 root 且权限为 644 的文件的路径。

案例三:删除系统中所有名为 *.bak 的备份文件

步骤

  1. 使用以下命令删除系统中所有名为 *.bak 的备份文件:
find / -name "*.bak" -delete
  • 1.

结果

该命令将删除系统中所有名为 *.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 -
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

脚本用法

  1. 将上述脚本保存为 clean_log.sh 文件。
  2. 修改脚本中的 log_dir 变量为您的日志目录路径。
  3. 赋予脚本可执行权限:
chmod +x clean_log.sh
  • 1.
  1. 运行脚本:
./clean_log.sh
  • 1.

定时任务

该脚本已设置了定时任务,每天凌晨 3 点自动执行。您也可以根据需要修改定时任务的时间。

注意事项

  • 请确保您有足够的权限执行该脚本。
  • 脚本会删除 7 天之前的日志压缩文件,请谨慎使用。
  • 脚本会压缩 3 天之前的日志文件,请确保您有足够的存储空间。

其他说明

  • 您可以根据需要修改脚本中的 keep_days 变量,以更改保留天数。
  • 您可以添加其他操作到脚本中,例如发送清理日志的通知邮件。

总结

find 命令是 Linux 系统中用于查找文件的强大工具,可以根据多种条件进行查找,并支持对匹配到的文件执行各种操作。掌握了 find 命令的使用方法,可以帮助运维人员快速定位和处理文件相关的问题。