find 命令 #
find
命令是一个强大的工具,用于在目录层次结构中搜索文件和目录。它可以根据各种条件(如名称、大小、修改时间等)查找文件,并可以对找到的文件执行操作。
语法 #
find [路径] [表达式]
如果未指定路径,则默认为当前目录。
常用选项和表达式 #
基本查找选项 #
选项/表达式 | 描述 |
---|---|
-name 模式 |
按文件名查找(区分大小写) |
-iname 模式 |
按文件名查找(不区分大小写) |
-type 类型 |
按文件类型查找(f=普通文件,d=目录,l=符号链接等) |
-size 大小 |
按文件大小查找 |
-mtime 天数 |
按修改时间查找(天) |
-mmin 分钟 |
按修改时间查找(分钟) |
-atime 天数 |
按访问时间查找(天) |
-amin 分钟 |
按访问时间查找(分钟) |
-ctime 天数 |
按状态更改时间查找(天) |
-cmin 分钟 |
按状态更改时间查找(分钟) |
-user 用户名 |
按所有者查找 |
-group 组名 |
按所属组查找 |
-perm 权限 |
按权限查找 |
-empty |
查找空文件或目录 |
-path 模式 |
按路径查找 |
-regex 模式 |
使用正则表达式查找 |
逻辑操作符 #
操作符 | 描述 |
---|---|
-a , -and |
逻辑与(默认) |
-o , -or |
逻辑或 |
! , -not |
逻辑非 |
( 表达式 ) |
分组表达式 |
动作选项 #
选项 | 描述 |
---|---|
-print |
打印匹配的文件名(默认动作) |
-ls |
以 ls -l 格式列出文件 |
-exec 命令 {} \; |
对每个匹配的文件执行命令 |
-exec 命令 {} + |
将多个匹配的文件作为参数传递给命令 |
-ok 命令 {} \; |
类似于-exec,但在执行前提示确认 |
-delete |
删除匹配的文件 |
常见用法 #
1. 按名称查找文件 #
find /path/to/search -name "filename.txt"
2. 不区分大小写查找文件 #
find /path/to/search -iname "filename.txt"
3. 查找特定类型的文件 #
find /path/to/search -type f # 查找普通文件
find /path/to/search -type d # 查找目录
find /path/to/search -type l # 查找符号链接
4. 按大小查找文件 #
find /path/to/search -size +10M # 大于10MB的文件
find /path/to/search -size -10M # 小于10MB的文件
find /path/to/search -size 10M # 恰好10MB的文件
大小单位:
c
: 字节k
: 千字节(1024 字节)M
: 兆字节(1024 千字节)G
: 吉字节(1024 兆字节)
5. 按时间查找文件 #
find /path/to/search -mtime -7 # 7天内修改的文件
find /path/to/search -mtime +7 # 7天前修改的文件
find /path/to/search -mmin -60 # 60分钟内修改的文件
6. 查找空文件或目录 #
find /path/to/search -empty
7. 按所有者或组查找文件 #
find /path/to/search -user username
find /path/to/search -group groupname
8. 按权限查找文件 #
find /path/to/search -perm 644 # 权限恰好是644的文件
find /path/to/search -perm -644 # 至少具有644权限的文件
find /path/to/search -perm /644 # 具有644中任一权限的文件
9. 组合条件查找 #
# 查找7天内修改的.txt文件
find /path/to/search -name "*.txt" -mtime -7
# 查找大于100MB且30天前修改的文件
find /path/to/search -size +100M -mtime +30
# 查找空目录
find /path/to/search -type d -empty
10. 使用逻辑操作符 #
# 查找.jpg或.png文件
find /path/to/search \( -name "*.jpg" -o -name "*.png" \)
# 查找不是.txt的文件
find /path/to/search -type f -not -name "*.txt"
11. 对找到的文件执行操作 #
# 删除找到的文件
find /path/to/search -name "*.tmp" -delete
# 对每个找到的文件执行命令
find /path/to/search -name "*.txt" -exec grep "pattern" {} \;
# 将多个文件作为参数传递给命令
find /path/to/search -name "*.txt" -exec grep "pattern" {} +
# 执行命令前提示确认
find /path/to/search -name "*.txt" -ok rm {} \;
12. 查找并显示详细信息 #
find /path/to/search -name "*.txt" -ls
13. 限制查找深度 #
find /path/to/search -maxdepth 2 -name "*.txt" # 最多查找到第2级子目录
14. 忽略特定目录 #
find /path/to/search -path "*/node_modules/*" -prune -o -name "*.js" -print
这将查找.js 文件,但忽略 node_modules 目录。
提示 #
- 使用
-type
选项可以限制查找特定类型的文件,提高效率 - 使用
-maxdepth
和-mindepth
可以控制查找的目录深度 - 在处理大量文件时,
-exec command {} +
比-exec command {} \;
更高效,因为它会将多个文件名作为参数传递给命令 - 使用
-prune
选项可以跳过特定目录,提高查找效率 - 在查找可能产生权限错误的目录时,可以将错误重定向到/dev/null:
find /path 2>/dev/null
- 使用
-not
或!
可以排除特定条件 - 在复杂查询中,使用括号
\( \)
对表达式进行分组 - 使用
-print0
和xargs -0
可以安全处理包含空格或特殊字符的文件名 - 在脚本中使用
find
时,考虑使用-print0
和xargs -0
组合来处理文件名中的特殊字符