菜鸟科技网

centos find命令

find 命令简介

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

centos find命令-图1
(图片来源网络,侵删)

基本语法:

find [搜索路径] [搜索条件] [操作]
  • 搜索路径: 指定从哪个目录开始搜索,如果省略,则默认为当前目录 。
  • 搜索条件: 这是 find 命令的核心,用于匹配文件名、类型、大小、时间等属性。
  • 操作: 对匹配到的文件执行什么操作,例如打印、删除、复制等,默认操作是 -print(即打印到屏幕)。

常用搜索条件

find 命令的强大之处在于其丰富的搜索条件。

按文件名搜索

这是最常用的搜索方式。

  • -name: 按文件名搜索(区分大小写)。
  • -iname: 按文件名搜索(不区分大小写)。
  • -regex: 按正则表达式匹配文件名(区分大小写)。
  • -iregex: 按正则表达式匹配文件名(不区分大小写)。

示例:

centos find命令-图2
(图片来源网络,侵删)
# 在 /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)。
    • 表示大于指定大小。
    • 表示小于指定大小。
    • 不带 或 表示精确匹配。

示例:

centos find命令-图3
(图片来源网络,侵删)
# 查找大于 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

-print0xargs -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 {} \;

重要提示

  1. 性能: find 在大型文件系统上可能会很慢,因为它需要遍历所有目录和文件。
  2. 安全: 在使用 -exec rm ... 或直接 find ... -delete 之前,务必先用 -print 或类似的只读选项(如 -ls)测试你的搜索条件,确保找到的是你想要的文件。
  3. 权限: find 命令需要有足够的权限去访问和搜索指定的目录,否则可能会报错或找不到文件。

希望这份详细的指南能帮助您在 CentOS 系统中熟练使用 find 命令!

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