find命令

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!可以排除特定条件
  • 在复杂查询中,使用括号\( \)对表达式进行分组
  • 使用-print0xargs -0可以安全处理包含空格或特殊字符的文件名
  • 在脚本中使用find时,考虑使用-print0xargs -0组合来处理文件名中的特殊字符