Find & Xargs 速查表
find 是 Linux 上最强大的文件查找工具,xargs 则是批量处理查找结果的最佳搭档。本速查表按功能类别整理了 find 和 xargs 的常用命令,涵盖按名称/路径、时间、大小、类型、权限查找,以及执行操作和批量处理等场景,每个命令都有实际使用示例。
使用场景速查
| 你要做什么 | 用哪个命令 |
| 按文件名查找 | find . -name "*.txt" | |
| 查找最近修改的文件 | find . -mtime -7 | |
| 查找大文件 | find . -size +100M | |
| 找到后执行操作 | find . -exec rm {} \; | |
| 只查找目录或文件 | find . -type d | |
| 按权限查找 | find . -perm 644 | |
| 批量处理结果 | find . -print0 \ | xargs -0 |
基本查找
``bash
# 按名称查找
find . -name "*.txt" # 按文件名精确匹配
find . -iname "readme*" # 忽略大小写
find . -name "[ab]*.py" # 通配符模式:[ab] 开头
find . -name "*.tmp" -o -name "*.log" # 或条件(-o)
# 按路径查找 find . -path "*/src/*.c" # 按路径匹配 find . -ipath "*/.git/*" # 路径忽略大小写 find . -regex '.*\.\(txt\|md\)$' # 正则匹配完整路径 find . -regextype posix-egrep -regex '.*\.(txt|md)$'
# 否定条件 find . -not -name "*.txt" # 取反 find . ! -name "*.txt" # 取反(! 简写)
# 限制搜索深度 find . -maxdepth 1 -name "*.txt" # 仅当前目录 find . -mindepth 2 -name "*.txt" # 至少从第2层目录开始 find . -maxdepth 3 -mindepth 1 # 第1-3层
# 按 inode 查找
find . -inum 1234567 # 按 inode 编号查找
find . -samefile /path/to/file # 查找硬链接
`
时间过滤
`bash
# 修改时间(mtime)
find . -mtime -7 # 最近 7 天内修改
find . -mtime +30 # 30 天前修改
find . -mtime 0 # 今天修改
# 访问时间(atime) find . -atime -3 # 最近 3 天访问过
# 状态变更时间(ctime) find . -ctime -1 # 最近 1 天状态变更
# 分钟级精度 find . -mmin -60 # 最近 60 分钟内修改 find . -mmin +120 # 超过 120 分钟前修改
# 新文件比较 find . -newer reference.txt # 比 reference.txt 更新的文件 find . -anewer reference.txt # 比 reference.txt 更新的访问时间 find . -cnewer reference.txt # 比 reference.txt 更新的状态变更
# 组合时间条件
find . -mtime -7 -a -mtime +0 # 7天内但不是今天
find . -daystart -mtime -1 # 从今天零点算起的最近 1 天
`
大小过滤
`bash
# 精确大小
find . -size 1024c # 精确 1024 字节
find . -size 1k # 精确 1KB(1024 字节)
# 大于/小于 find . -size +100M # 大于 100MB find . -size -1G # 小于 1GB find . -size +500k -a -size -1M # 500KB 到 1MB 之间
# 其他单位 find . -size +1G # 大于 1GB find . -size +10M # 大于 10MB find . -size +1000k # 大于 1000KB find . -size +1M -a -size -10M # 1MB 到 10MB 之间
# 空文件/空目录
find . -empty # 空文件或空目录
find . -type f -empty # 空文件
find . -type d -empty # 空目录
`
执行操作
`bash
# -exec 基础
find . -name "*.bak" -exec rm {} \; # 删除每个文件(\; 结束)
find . -name "*.log" -exec rm {} + # 批量作为参数(+ 结束,更快)
# -ok 带确认 find . -name "*.tmp" -ok rm {} \; # 删除前逐个确认
# 多次执行不同命令 find . -name "*.txt" -exec cp {} {}.back \; # 复制为 .back 后缀
# execdir(在文件所在目录执行) find . -name "*.txt" -execdir rm {} \; # 更安全(在当前目录执行) find . -name "*.jpg" -execdir convert {} {}.png \; # 转换图片
# 使用 sh -c 执行复杂命令 find . -name "*.html" -exec sh -c 'gzip "{}"' \; # 对每个文件执行 find . -name "*.log" -exec sh -c 'mv "$1" "${1%.log}.txt"' _ {} \; # 重命名
# 删除匹配的文件
find . -name "*.swp" -delete # 直接删除(比 -exec rm 更快)
`
类型过滤
`bash
# 按文件类型
find . -type f # 只查找普通文件
find . -type d # 只查找目录
find . -type l # 只查找符号链接
find . -type s # 只查找 socket 文件
find . -type p # 只查找命名管道(FIFO)
find . -type b # 块设备
find . -type c # 字符设备
# 组合类型 find . -type f -o -type l # 文件或符号链接 find . -type f -a -name "*.sh" # 普通文件且以 .sh 结尾
# 按链接
find . -type l -ls # 查找符号链接并显示详情
find . -xtype l # 查找断开的符号链接
`
权限查找
`bash
# 精确权限匹配
find . -perm 644 # 精确权限 644
find . -perm 755 # 精确权限 755
# 包含某权限 find . -perm -u=r # 拥有者有读权限 find . -perm -g=w # 组有写权限 find . -perm -o=x # 其他人有执行权限
# 任意用户有某权限 find . -perm /u=r # 任意用户有读权限 find . -perm /222 # 任意用户有写权限
# 按属主/属组 find . -user admin # 属于 admin 用户 find . -group www-data # 属于 www-data 组 find . -uid 1000 # 按用户 ID find . -gid 100 # 按组 ID
# 按文件模式
find . -type f -perm /4000 # SUID 文件
find . -type f -perm /2000 # SGID 文件
find . -type f -perm /1000 # sticky bit
`
批量操作(Xargs)
`bash
# 基本使用
find . -name "*.txt" | xargs rm # 删除所有 .txt 文件(注意空格问题)
find . -name "*.txt" -print0 | xargs -0 rm # 正确处理空格文件名
# 批量操作 find . -name "*.py" -print0 | xargs -0 -I {} cp {} /backup/ # 复制到备份 find . -name "*.jpg" -print0 | xargs -0 -P 4 convert -resize 50% # 并行处理
# 统计和计数 find . -name "*.log" -print0 | xargs -0 wc -l # 统计所有日志行数 find . -type f -print0 | xargs -0 ls -lh # 查看文件详情
# 限制参数数量 find . -print0 | xargs -0 -n 10 ls -lh # 每次最多 10 个参数
# 占位符 find . -name "*.txt" -print0 | xargs -0 -I file cp file /tmp/ # 用 file 占位
# 交互式处理 find . -name "*.tmp" -print0 | xargs -0 -p rm # 执行前确认
# 组合 grep find . -name "*.py" -print0 | xargs -0 grep -l "TODO" # 查找含 TODO 的文件 find . -type f -print0 | xargs -0 grep -c "error" | grep -v ":0$" # 含 error 的文件 ``
基本查找(7)
| 命令 | 难度 | ||
|---|---|---|---|
find . -name按文件名查找(支持通配符) | 基础 | find . -name "*.txt" | |
find . -iname按文件名查找(忽略大小写) | 基础 | find . -iname "readme*" | |
find . -path / -ipath按路径模式匹配 | 中级 | find . -path "*/src/*.c" | |
find . -regex用正则表达式匹配完整路径 | 高级 | find . -regextype posix-egrep -regex '.*\.(txt|md)$' | |
find . -maxdepth / -mindepth限制搜索目录深度 | 中级 | find . -maxdepth 2 -mindepth 1 -name "*.txt" | |
find . -not / !查找不匹配条件的文件(取反) | 中级 | find . -not -name "*.txt" | |
find . -o多个条件或(OR)组合 | 中级 | find . -name "*.tmp" -o -name "*.log" |
时间过滤(4)
| 命令 | 难度 | ||
|---|---|---|---|
find . -mtime按文件修改时间过滤(天级) | 基础 | find . -mtime -7 | |
find . -mmin按文件修改时间过滤(分钟级) | 中级 | find . -mmin -60 | |
find . -atime / -amin按文件访问时间过滤 | 中级 | find . -atime -3 | |
find . -newer查找比指定文件更新的文件 | 中级 | find . -newer reference.txt |
大小过滤(3)
| 命令 | 难度 | ||
|---|---|---|---|
find . -size按文件大小过滤(支持 +/- | 基础 | find . -size +100M | |
find . -size +100M查找大于 100MB 的文件 | 基础 | find . -size +100M | |
find . -empty查找空文件或空目录 | 基础 | find . -type f -empty |
执行操作(6)
| 命令 | 难度 | ||
|---|---|---|---|
find . -exec {} \;对每个匹配文件执行命令 | 基础 | find . -name "*.bak" -exec rm {} \; | |
find . -exec {} +批量执行命令(所有文件一次传入) | 中级 | find . -name "*.log" -exec rm {} + | |
find . -ok执行命令前逐个确认 | 中级 | find . -name "*.tmp" -ok rm {} \; | |
find . -execdir在文件所在目录执行命令(更安全) | 高级 | find . -name "*.txt" -execdir rm {} \; | |
find . -delete直接删除匹配文件(比 -exec rm 更快) | 基础 | find . -name "*.swp" -delete | |
find . -exec sh -c使用 shell 执行复杂命令 | 高级 | find . -name "*.log" -exec sh -c 'mv "$1" "${1%.log}.txt"' _ {} \; |
类型过滤(3)
| 命令 | 难度 | ||
|---|---|---|---|
find . -type f只查找普通文件 | 基础 | find . -type f -name "*.sh" | |
find . -type d只查找目录 | 基础 | find . -type d -empty | |
find . -type l / -xtype l查找符号链接或断开的链接 | 中级 | find . -xtype l |
权限查找(4)
| 命令 | 难度 | ||
|---|---|---|---|
find . -perm按精确权限查找 | 中级 | find . -perm 644 | |
find . -perm -mode查找包含指定权限的文件 | 中级 | find . -perm -u=r | |
find . -user / -group按属主或属组查找 | 中级 | find . -user admin -group www-data | |
find . -perm /4000查找 SUID/SGID/sticky bit 文件 | 高级 | find . -type f -perm /4000 |
批量操作(6)
| 命令 | 难度 | ||
|---|---|---|---|
xargs -0以 null 字符分隔的 xargs(安全处理空格) | 基础 | find . -name "*.txt" -print0 | xargs -0 rm | |
xargs -I {}使用占位符替换参数位置 | 中级 | find . -name "*.py" -print0 | xargs -0 -I {} cp {} /backup/ | |
xargs -P N并行执行命令(N 个进程同时) | 高级 | find . -name "*.jpg" -print0 | xargs -0 -P 4 convert -resize 50% | |
xargs -n N每次最多传递 N 个参数 | 中级 | find . -print0 | xargs -0 -n 10 ls -lh | |
xargs -p执行前确认(交互模式) | 中级 | find . -name "*.tmp" -print0 | xargs -0 -p rm | |
find . -print0 | xargs -0 grep批量搜索文件内容 | 中级 | find . -name "*.py" -print0 | xargs -0 grep -l "TODO" |