系统中有无数文件,定位特定文件可能很困难。find 命令通过名称、类型、大小和修改时间等条件搜索目录树。
命令行 · 第 14 课
find 命令
学习按名称、类型、大小和时间搜索目录树,并对确认过的匹配项执行操作。
选择搜索位置
基本语法是:
find [PATH] [EXPRESSION]
路径用于选择起点,表达式则筛选起点以下的条目,或对它们执行操作。
例如,要在 /home 目录及其所有子目录中查找名为 puppies.jpg 的文件,可以使用:
$ find /home -name puppies.jpg
默认会递归搜索。要搜索当前目录树,请用 . 作为起始路径。
哪个命令会在当前目录及其后代中搜索名为 notes.txt 的条目?
匹配名称和类型
find 最常用的功能之一是按文件名搜索。-name 选项用于精确匹配名称或使用 shell 风格的模式匹配。
$ find . -name "*.txt"
通配符模式需要加引号,让当前 shell 原样把它传给 find。不加引号时,shell 可能在 find 启动前就依据当前目录展开 *.txt。需要忽略字母大小写时,请使用 -iname。
你还可以指定搜索的项目类型。-type 选项用于此目的。例如,如果你想查找目录而不是文件,可以使用 d。
$ find /home -type d -name MyFolder
这里两个测试都必须为真:条目必须是目录,而且基本名称必须为 MyFolder。
哪个命令会查找当前目录下名称以 .txt 结尾的普通文件?
匹配大小和修改时间
你可以按文件大小搜索:
$ find . -type f -size +10M
$ find . -type f -size -1k
大写 M 表示 1,048,576 字节为一个单位,小写 k 表示 1,024 字节为一个单位。find 会先按所选单位向上取整文件大小,再进行数值比较,因此边界行为以这些单位为准。
你也可以按修改时间搜索:
$ find . -type f -mtime -7
$ find . -type f -mtime +30
-mtime 测试文件修改后经过的完整 24 小时周期数。-mtime -7 匹配小于 7 的值,-mtime +30 匹配大于 30 的值;由于使用完整的 24 小时周期,边界并不以日历午夜为准。
哪个命令会查找 . 下修改时间不足七个完整 24 小时周期的普通文件?
打印匹配项并执行操作
默认情况下,find 会打印匹配的路径。你可以添加操作,如 -print、-delete 或 -exec。
显式打印匹配项:
$ find . -name "*.log" -print
对每个匹配项运行 ls -l:
$ find . -name "*.log" -exec ls -l {} \;
在 \; 形式中,每次调用命令时,{} 会替换为一个匹配路径。分号终止 -exec 操作;对它进行转义,是为了让 shell 把它传给 find。
使用 -delete 或会修改文件的 -exec 等破坏性操作前,应对相同测试运行 -print,并检查每项结果。更窄的起始路径和 -maxdepth N 也能限制搜索范围。
你正在编写一个以后可能删除旧 .log 文件的 find 命令。首先应该做什么?
在 find . -name "*.log" -exec ls -l {} \; 中,{} 表示什么?
出现权限拒绝消息,通常意味着当前账户无法搜索目录树的一部分。应优先选择更窄且相关的起始路径;在尚未理解并明确需要扩展访问范围前,不要提升权限。
要练习构建搜索表达式,可以尝试以下动手实验:
- Linux find 命令:文件搜索 - 本实验介绍
find命令,这是一款功能强大的工具,用于根据各种条件搜索和定位文件及目录。你将练习使用find定位特定文件。 - 发现关键系统资源 - 学习定位文件和可执行文件的基本 Linux 命令,包括
find。你将练习高效浏览文件系统并发现关键系统资源。
课程已完成
你已完成 find 命令
现在,你可以构建范围明确的 find 表达式,并在执行操作前验证结果。
选择满足需要的最窄起始路径。
给名称模式加引号,并与类型测试组合。
按大小或完整的 24 小时修改周期筛选。
在适当时限制递归深度。
执行破坏性操作前打印并检查匹配项。