菜鸟科技网

centos find 命令

find 命令的基本语法

find 命令的基本结构如下:

centos find 命令-图1
(图片来源网络,侵删)
find [搜索路径] [匹配条件] [操作]
  • 搜索路径: 指定要开始搜索的目录,如果省略,则默认从当前目录 () 开始搜索。
  • 匹配条件: 指定查找文件需要满足的条件,如文件名、大小、类型、修改时间等。
  • 操作: 对找到的文件执行什么操作,如打印、删除、修改权限等,默认操作是 -print(即打印文件路径到标准输出)。

常用匹配条件

这是 find 命令的核心,也是最常用的部分。

按文件名搜索

  • -name: 按文件名搜索(区分大小写)。
  • -iname: 按文件名搜索(不区分大小写)。
  • -path: 按路径名搜索(区分大小写)。
  • -ipath: 按路径名搜索(不区分大小写)。

示例:

# 在 /etc 目录下查找所有名为 "hosts" 的文件
find /etc -name "hosts"
# 在当前目录及其子目录下查找所有以 ".log" 结尾的文件(不区分大小写)
find . -iname "*.log"
# 在 /var 目录下查找路径中包含 "www" 的目录
find /var -path "*www*"

通配符:

  • 匹配任意数量的字符
  • 匹配单个字符
  • [] 匹配指定范围内的字符,[a-z] 匹配任意小写字母。

按文件类型搜索

  • -type: 根据文件类型进行筛选。
    • f: 普通文件
    • d: 目录
    • l: 符号链接
    • c: 字符设备文件
    • b: 块设备文件
    • s: 套接字文件
    • p: 命名管道

示例:

centos find 命令-图2
(图片来源网络,侵删)
# 查找 /home 目录下所有的目录
find /home -type d
# 查找当前目录下所有的符号链接
find . -type l

按文件所有者和所属组搜索

  • -user: 按文件所有者(用户名)搜索。
  • -group: 按文件所属组(组名)搜索。
  • -uid: 按用户 ID 搜索。
  • -gid: 按组 ID 搜索。

示例:

# 查找 /home 目录下所有属于 "nginx" 用户的文件
find /home -user nginx
# 查找 /var 目录下所有属于 "www" 组的文件
find /var -group www

按文件大小搜索

  • -size: 按文件大小搜索,可以使用以下单位:
    • c: 字节
    • k: KB (1024 bytes)
    • M: MB (1024 KB)
    • G: GB (1024 MB)
    • T: TB (1024 GB)

可以使用 或 来表示“大于”或“小于”。

示例:

# 查找当前目录下大小恰好为 100MB 的文件
find . -size 100M
# 查找 /var/log 目录下所有大于 100MB 的日志文件
find /var/log -size +100M
# 查找当前目录下所有小于 1KB 的文件
find . -size -1k

按时间搜索

  • -mtime: 按文件内容最后修改时间(天)。
  • -atime: 按文件最后访问时间(天)。
  • -ctime: 按文件状态(如权限、所有者)最后改变时间(天)。

同样,可以使用 或 来表示“多于”或“少于”天。

示例:

# 查找 7 天内被修改过的文件
find . -mtime -7
# 查找超过 30 天未被访问的文件
find . -atime +30
# 查找在 1 到 2 天前状态发生改变的文件
# 注意:find 不支持直接的数值范围,需要组合使用 -a (and)
find . -mtime -2 -a -mtime +1

按权限和 inode 搜索

  • -perm: 按文件权限搜索。
    • -mode: 精确匹配权限(-perm 755)。
    • /mode: 任意一位匹配即可(/222 表示任意用户有写权限)。
    • -mode: 所有位都必须匹配(-mode 222 表示所有用户都有写权限)。
  • -inum: 按 inode 号搜索。

示例:

# 查找权限恰好为 644 的文件
find . -perm 644
# 查找所有用户(所有者、组、其他)都有执行权限的文件
find . -perm /111
# 查找其他用户有写权限的文件
find . -perm /002
# 查找 inode 号为 12345 的文件
find . -inum 12345

组合条件

可以使用逻辑运算符将多个条件组合起来。

  • -a (and): 逻辑与,表示必须同时满足两个条件,默认操作符,可以省略。
  • -o (or): 逻辑或,满足其中一个条件即可。
  • -not: 逻辑非,表示不满足该条件。

示例:

# 查找 /etc 目录下,修改时间在 7 天内,并且以 ".conf" 结尾的文件
find /etc -mtime -7 -a -name "*.conf"
# 查找 /var 目录下,大小大于 50MB,并且属于 "root" 用户的文件
find /var -size +50M -a -user root
# 查找 /tmp 目录下,不属于 "root" 用户的文件
find /tmp ! -user root
# 查找 /home 目录下,所有者是 "testuser" 或者所属组是 "developers" 的文件
find /home \( -user testuser -o -group developers \)

注意: 当使用 -o 或 时,如果条件复杂,最好用 \(\) 将它们括起来,以确保优先级正确。


常用操作

默认操作:-print

这是默认操作,将文件路径打印到屏幕上。

# 以下两条命令效果相同
find . -name "*.txt"
find . -name "*.txt" -print

-exec: 执行命令

这是 find 最强大的功能之一,可以对找到的每个文件执行指定的命令。

语法:-command {} \;

  • 是一个占位符,会被替换为当前找到的文件的完整路径。
  • \; 是用来结束 -exec 命令的固定符号,前面需要反斜杠。

示例:

# 查找所有 .tmp 文件并删除 (危险操作!)
# -ok 会先询问用户是否执行,更安全
find . -name "*.tmp" -exec rm -f {} \;
# 查找所有 .sh 文件并添加可执行权限
find . -name "*.sh" -exec chmod +x {} \;
# 查找所有 .log 文件,并用 grep 在它们中搜索 "error"
find . -name "*.log" -exec grep "error" {} \;

-ok: 安全的 -exec

-ok-exec 的功能一样,但会在执行每个命令前,向用户发起确认,对于删除等危险操作,强烈推荐使用 -ok

示例:

# 删除前会询问你是否真的要删除
find . -name "*.tmp" -ok rm -f {} \;

-delete: 删除文件

这是 find 自带的一个删除操作,比 -exec rm {} \; 更简洁、更高效。

示例:

# 删除当前目录下所有名为 .DS_Store 的文件
find . -name ".DS_Store" -delete

警告: -delete 操作非常强大,请确保你的搜索路径和条件是正确的,以免误删重要文件。

-ls: 以 ls -ils 的格式列出文件

以类似 ls 命令的详细格式输出查找结果,包含 inode、权限、所有者、大小、时间等信息。

示例:

# 列出 /etc 目录下所有 conf 文件的详细信息
find /etc -name "*.conf" -ls

综合实例

场景1:查找并清理大文件

# 查找 /var 目录下所有超过 1GB 的大文件,并列出它们的详细信息
find /var -type f -size +1G -ls
# 查找 /home 目录下 30 天内未被修改、大小超过 10MB 的文件,并询问是否删除
find /home -type f -mtime +30 -size +10M -ok -delete \;

场景2:查找特定权限的文件

# 查找所有用户(包括其他用户)都有写权限的文件,这可能存在安全风险
find / \( -perm /002 -a ! -type d \) -ls

场景3:查找并打包文件

# 查找 /etc 目录下所有 .conf 文件,并将它们打包成 etc_conf.tar.gz
# 注意:这里使用了 `+` 代替 `\;`,表示将所有找到的文件作为参数一次性传给 tar 命令,效率更高
find /etc -name "*.conf" -exec tar -czf etc_conf.tar.gz {} +

find 命令与 grep 命令的区别

初学者经常会混淆 findgrep,它们有本质区别:

特性 find grep
搜索对象 文件(按文件名、属性、大小等) (按文本字符串)
搜索范围 目录树(文件系统) (文本流)
常用组合 find ... -exec grep ... grep -r ... (递归搜索)

简单记忆:

  • find 是找文件本身。
  • grep 是在文件里找文字

示例:

# 使用 find + grep 组合:先找到所有 .log 文件,然后在这些文件的内容中搜索 "ERROR"
find /var/log -name "*.log" -exec grep "ERROR" {} \;
# 使用 grep 的 -r 选项可以达到类似效果(更简单)
grep -r "ERROR" /var/log --include="*.log"

find 命令是 CentOS/Linux 系统管理员的瑞士军刀,掌握它需要实践,建议从简单的 -name-type-size 开始,然后逐步学习 -exec-delete 等高级功能,使用时,特别是涉及删除操作时,务必小心谨慎,可以先使用 -ls-ok 来预览和确认。

分享:
扫描分享到社交APP
上一篇
下一篇