"Find" 是一个用于在指定目录树中搜索文件和目录的命令行工具。
该命令通过递归遍历指定路径下的所有子目录,根据用户指定的条件(如文件名、类型、大小、修改时间等)筛选文件,并可对匹配的文件执行进一步操作(如删除、复制等),是系统管理和文件查找的核心工具。
find [路径] [选项/表达式] [动作]路径:指定搜索的起始目录(默认为当前目录
.),可指定多个路径(如find /home /var -name "*.log")。选项/表达式:定义搜索条件(如文件名匹配、类型筛选等)。
动作:对匹配文件执行的操作(如
-print输出路径,-exec执行命令等)。
常用选项/表达式
1. 按文件名/路径匹配
-name <模式>:"name pattern",按文件名匹配(区分大小写),支持通配符*(任意字符)、?(单个字符)、[](字符范围)。例如find /tmp -name "*.txt"查找/tmp下所有.txt文件。-iname <模式>:"case-insensitive name",按文件名匹配(忽略大小写)。例如find . -iname "readme"匹配README、ReadMe等。-path <模式>:"path pattern",按文件完整路径匹配(区分大小写)。例如find / -path "*/etc/*.conf"查找路径中包含/etc/且以.conf结尾的文件。
2. 按文件类型筛选
-type <类型>:"file type",按文件类型筛选。常见类型:f:普通文件(如文本、二进制文件);d:目录;l:符号链接;s:套接字文件;b:块设备文件(如硬盘);c:字符设备文件(如键盘)。例如
find /dev -type b查找所有块设备文件。
3. 按时间属性筛选
-mtime <天数>:"modification time",按文件内容最后修改时间筛选(单位:天)。正数
+n:修改时间超过n天的文件(如+7表示7天前及更早);负数
-n:修改时间在n天内的文件(如-3表示3天内修改过);零
n:正好n天前修改的文件(如0表示今天修改的)。例如
find /var/log -type f -mtime +30查找30天前修改的日志文件。
-atime <天数>:"access time",按文件最后访问时间筛选(用法同-mtime)。-ctime <天数>:"change time",按文件元数据(权限、所有者等)最后修改时间筛选(用法同-mtime)。
4. 按大小筛选
-size <大小>:"file size",按文件大小筛选,支持单位:b:块(512字节,默认);c:字节;k:KB;M:MB;G:GB。正数
+n:大于n单位的文件(如+100M表示超过100MB);负数
-n:小于n单位的文件(如-1k表示小于1KB);零
n:正好n单位的文件(如50M表示正好50MB)。例如
find /home -type f -size +1G查找/home下大于1GB的文件。
5. 按权限/所有者筛选
-perm <权限模式>:"permission",按文件权限筛选。例如find . -perm 644查找权限为644的文件;find . -perm -u+x查找所有者有执行权限的文件。-user <用户名/UID>:"user owner",按文件所有者筛选。例如find /home -user alice查找所有者为alice的文件。-group <组名/GID>:"group owner",按文件所属组筛选。例如find /var -group admin查找所属组为admin的文件。
6. 搜索范围限制
-maxdepth <层数>:"maximum depth",限制最大搜索深度(从起始目录开始算,1表示仅搜索起始目录本身,不包括子目录)。例如find / -maxdepth 2 -name "hosts"仅在根目录及一级子目录中搜索hosts文件。-mindepth <层数>:"minimum depth",限制最小搜索深度(至少深入n层后开始搜索)。例如find . -mindepth 3 -type f仅搜索至少3层子目录下的文件。
7. 逻辑组合与动作
-not或!:否定条件。例如find . -type f -not -name "*.log"查找非.log结尾的普通文件。-a或-and:逻辑与(默认,可省略)。例如find . -type f -a -mtime -7查找7天内修改的普通文件。-o或-or:逻辑或。例如find . -name "*.txt" -o -name "*.md"查找.txt或.md文件。-print:输出匹配文件的路径(默认动作,可省略)。例如find . -name "test"等效于find . -name "test" -print。-exec <命令> {} \;:对匹配文件执行指定命令({}代表匹配的文件路径,\;是命令结束标记)。例如find . -name "*.tmp" -exec rm -f {} \;删除所有.tmp文件。
参考示例
示例1:查找当前目录下所有
.sh脚本文件执行
find . -name "*.sh" -type f,递归搜索当前目录(.)下文件名以.sh结尾的普通文件(-type f排除目录和链接)。示例2:清理7天前的日志文件
执行
find /var/log/app -type f -name "*.log" -mtime +7 -exec rm -f {} \;,步骤:在
/var/log/app目录搜索普通文件(-type f);筛选
.log结尾且修改时间超过7天的文件(-mtime +7);对匹配文件执行强制删除(
-exec rm -f {} \;),适合日志定期清理脚本。
示例3:查找大文件(超过1GB)并统计大小
执行
find /home -type f -size +1G -exec du -h {} \;,搜索/home下大于1GB的文件,并通过du -h以人类可读格式显示每个文件的大小,便于排查磁盘占用问题。示例4:查找最近24小时内修改的配置文件
执行
find /etc -type f -name "*.conf" -mtime -1,在/etc目录搜索24小时内(-mtime -1)修改过的.conf配置文件,适合跟踪近期配置变更。示例5:查找无所有者的文件(孤儿文件)
执行
find / -nouser -o -nogroup,搜索系统中无有效所有者(-nouser)或无有效所属组(-nogroup)的文件,通常是删除用户/组后遗留的文件,需管理员处理。示例6:限制搜索深度,仅查找当前目录的子目录
执行
find . -maxdepth 2 -type d -name "backup*",仅在当前目录(maxdepth 1)和一级子目录(maxdepth 2)中搜索名称以backup开头的目录,避免深层目录干扰。示例7:批量替换文件内容(结合sed)
执行
find . -type f -name "*.html" -exec sed -i 's/old_url/new_url/g' {} \;,递归查找所有.html文件,并通过sed批量替换其中的old_url为new_url,适合网站迁移时更新链接。示例8:查找具有危险权限的文件(如所有人可写)
执行
find / -type f -perm -o+w -not -path "/proc/*",搜索系统中所有人(other)有写入权限的文件(-perm -o+w),并排除/proc虚拟文件系统(避免无意义结果),用于安全审计。
注意:
在根目录(
/)执行find时需谨慎,可能搜索大量文件导致系统负载升高,建议结合-maxdepth或限定路径(如/home、/var)。使用
-exec时,{}前后需有空格,且必须以\;结尾(部分系统支持+代替\;以批量执行命令,提高效率)。通配符需用引号包裹(如
"*.txt"),避免被Shell提前解析。