find 命令简介
find 命令用于在指定的目录树中递归地搜索文件,并可以根据您指定的条件执行相应的操作。

基本语法:
find [搜索路径] [搜索条件] [操作]
- 搜索路径: 指定从哪个目录开始搜索,如果省略,则默认为当前目录 。
- 搜索条件: 这是
find命令的核心,用于匹配文件名、类型、大小、时间等属性。 - 操作: 对匹配到的文件执行什么操作,例如打印、删除、复制等,默认操作是
-print(即打印到屏幕)。
常用搜索条件
find 命令的强大之处在于其丰富的搜索条件。
按文件名搜索
这是最常用的搜索方式。
-name: 按文件名搜索(区分大小写)。-iname: 按文件名搜索(不区分大小写)。-regex: 按正则表达式匹配文件名(区分大小写)。-iregex: 按正则表达式匹配文件名(不区分大小写)。
示例:

# 在 /home 目录下查找所有名为 test.txt 的文件 find /home -name "test.txt" # 在当前目录及其子目录下查找所有以 .log 结尾的文件(不区分大小写) find . -iname "*.log" # 在 /var 目录下查找所有名为 "message" 或 "messages" 的文件 find /var -regex ".*message.*" # 在 /etc 目录下查找所有以 "conf" 结尾的文件 find /etc -regex ".*\.conf$"
提示: 在使用通配符(如 , )时,建议用双引号 括起来,防止 Shell 在
find命令执行前对其进行扩展。
按文件类型搜索
-type: 按文件类型查找。f: 普通文件d: 目录l: 符号链接b: 块设备文件c: 字符设备文件p: 管道文件s: 套接字文件
示例:
# 查找 /dev 目录下所有的块设备文件 find /dev -type b # 查找当前目录下所有的子目录 find . -type d # 查找 /usr/bin 目录下所有的符号链接 find /usr/bin -type l
按文件所有者和所属组搜索
-user: 按文件所有者(用户名)查找。-group: 按文件所属组(组名)查找。-uid: 按文件所有者的用户 ID 查找。-gid: 按文件所属组的组 ID 查找。
示例:
# 查找 /home 目录下所有属于 "nginx" 用户的文件 find /home -user nginx # 查找 /var 目录下所有属于 "developers" 组的文件 find /var -group developers # 查找所有用户 ID 为 1000 的文件 find / -uid 1000
按文件大小搜索
-size: 按文件大小查找。c: 表示字节(Byte)。k: 表示千字节(KB)。M: 表示兆字节(MB)。G: 表示吉字节(GB)。- 表示大于指定大小。
- 表示小于指定大小。
- 不带 或 表示精确匹配。
示例:

# 查找大于 100MB 的文件 find / -type f -size +100M # 查找小于 1KB 的文件 find /tmp -type f -size -1k # 查找大小恰好为 4096 字节(通常是一个块设备或 inode)的文件 find / -type f -size 4096c
按时间搜索
-
-mtime: 按文件内容最后修改时间(天)查找。 -
-atime: 按文件最后访问时间(天)查找。 -
-ctime: 按文件状态(如权限、所有者)最后改变时间(天)查找。+N: 表示 N 天之前。-N: 表示 N 天之内。N: 表示正好 N 天。
-
-mmin,-amin,-cmin: 与上面类似,但单位是分钟。
示例:
# 查找 7 天内被修改过的文件 find /var/log -type f -mtime -7 # 查找 30 天前未被访问过的文件(可用于清理) find /home -type f -atime +30 # 查找 1 小时内状态发生变化的文件 find /etc -type f -cmin -60
按权限和 inode 搜索
-perm: 按文件权限查找。/mode: 任意一位用户(所有者、组、其他)拥有指定的权限位即可匹配。-perm /644表示任意用户拥有读、写、执行中的任意组合,只要最终结果是 644 即可,这是最常用的方式。-mode: 精确匹配权限位。-mode: 文件权限位必须完全包含指定的权限位。-perm -644表示所有者必须有读、写权限,组用户和其他用户必须有读权限。
-inum: 按 inode 号查找。
示例:
# 查找权限恰好为 755 的文件 find . -type f -perm 755 # 查找所有者拥有读、写、执行权限,且组用户和其他用户至少拥有读权限的文件 find . -type f -perm -755 # 查找任何人都可以执行的文件(安全风险,需谨慎) find / -type f -perm /111 # 查找 inode 号为 12345 的文件 find / -inum 12345
组合搜索条件
可以使用逻辑运算符 -a (AND, 与)、-o (OR, 或) 和 (NOT, 非) 来组合多个条件。
-a(AND): 默认操作符,可以省略。-o(OR): 只要满足其中一个条件即可。- (NOT): 对条件取反。
示例:
# 查找 /home 目录下,属于 "nginx" 用户并且大于 100MB 的文件 find /home -type f -user nginx -a -size +100M # 查找 /var/log 目录下,以 .log 结尾或者在过去 7 天内被修改过的文件 find /var/log \( -name "*.log" -o -mtime -7 \) # 查找 /tmp 目录下,非普通文件的所有项(包括目录、设备等) find /tmp ! -type f # 查找 /etc 目录下,所有者不是 root 的文件 find /etc ! -user root
提示: 当使用
-o或包含空格的条件时,建议用反斜杠\或括号 将条件组合起来,以避免 Shell 产生歧义。
常用操作
默认情况下,find 会将匹配到的文件名打印到屏幕上(即 -print),但我们可以通过 -exec 等选项执行更强大的操作。
-exec:执行命令
这是 find 最强大的功能之一,它对每一个匹配到的文件执行指定的命令。
语法:
find ... -exec command {} \;
- 是一个占位符,会被替换为当前找到的文件的完整路径。
\;: 是用来结束-exec命令的分号,必须用反斜杠\转义,防止 Shell 误解它。
示例:
# 查找所有 .tmp 文件并删除(危险操作!)
# -ok 会先询问用户是否执行,更安全
find /tmp -name "*.tmp" -exec rm -f {} \;
# 查找所有 .jpg 文件,并用 ls -l 命令列出详细信息
find /home -name "*.jpg" -exec ls -l {} \;
# 查找所有权限为 644 的文件,并执行 chmod 644(虽然是冗余操作,但演示用法)
find . -type f -perm 644 -exec chmod 644 {} \;
-ok:交互式执行
-ok 和 -exec 功能一样,但每次执行命令前都会向用户请求确认,对于删除等危险操作,强烈建议使用 -ok。
示例:
# 安全地删除 /tmp 目录下超过 30 天的文件
find /tmp -mtime +30 -ok rm -v {} \;
-delete:直接删除
这是一个更简单、更安全的删除操作,是 find 内置的功能,不需要调用外部 rm 命令。
示例:
# 删除 /var/log 目录下所有 30 天前的 .log 文件 find /var/log -name "*.log" -mtime +30 -delete
-print0 和 xargs -0:处理文件名中的空格和特殊字符
当文件名中包含空格、换行符等特殊字符时,使用 xargs 配合 -print0 和 -0 是最安全的方式。
-print0: 使用\0(NULL) 作为分隔符来打印文件名,而不是默认的换行符。xargs -0: 从标准输入读取,并以\0作为分隔符来解析输入。
示例:
# 查找所有文件,并用 xargs 安全地传递给 tar 命令进行打包 # 这种方式可以正确处理任何文件名 find /path/to/files -print0 | xargs -0 tar -czf archive.tar.gz
综合实例
场景1:清理日志文件
查找 /var/log 目录下所有 30 天前修改过的 .log 文件,并删除它们。
# 方式一:使用 -exec (危险)
find /var/log -name "*.log" -mtime +30 -exec rm -f {} \;
# 方式二:使用 -ok (安全,会询问)
find /var/log -name "*.log" -mtime +30 -ok rm -v {} \;
# 方式三:使用 -delete (简洁安全)
find /var/log -name "*.log" -mtime +30 -delete
场景2:查找大文件 查找根目录下大于 1GB 的文件,并按大小从大到小排序。
# -exec ls -lh {} + 比 \; 更高效,因为它会将多个文件作为参数一次性传递给 ls
find / -type f -size +1G -exec ls -lh {} + | sort -k 5 -hr
ls -lh: 以人类可读的格式显示文件大小。sort -k 5 -hr: 按第 5 列(文件大小)进行反向(-r)排序,并且使用人类可读的数字(-h)进行比较。
场景3:查找无用的 core 文件
查找整个系统中名为 core 的文件(通常是程序崩溃时产生的转储文件),并删除它们。
find / -name "core" -type f -exec rm -f {} \;
重要提示
- 性能:
find在大型文件系统上可能会很慢,因为它需要遍历所有目录和文件。 - 安全: 在使用
-exec rm ...或直接find ... -delete之前,务必先用-print或类似的只读选项(如-ls)测试你的搜索条件,确保找到的是你想要的文件。 - 权限:
find命令需要有足够的权限去访问和搜索指定的目录,否则可能会报错或找不到文件。
希望这份详细的指南能帮助您在 CentOS 系统中熟练使用 find 命令!
