基础操作
- 删除所有
.tmp
文件
find . -name "*.tmp" -print0 | xargs -0 rm
- 统计所有
.txt
文件的行数
find . -name "*.txt" -print0 | xargs -0 wc -l
- 查找并压缩所有
.log
文件
find /var/log -name "*.log" -print0 | xargs -0 gzip
文件内容处理
- 批量替换文本内容
find . -name "*.conf" -print0 | xargs -0 sed -i 's/old/new/g'
- 查找包含关键词的文件
find . -type f -print0 | xargs -0 grep -l "SECRET_KEY"
- 删除所有空文件
find . -type f -empty -print0 | xargs -0 rm
权限与所有权
- 修复目录权限为 755
find . -type d -print0 | xargs -0 chmod 755
- 修复文件权限为 644
find . -type f -print0 | xargs -0 chmod 644
- 修改所有者为
www-data
find /var/www -user root -print0 | xargs -0 chown www-data:www-data
备份与清理
- 备份 7 天内修改的文件
find /data -mtime -7 -print0 | xargs -0 tar -czvf backup.tar.gz
- 删除 30 天前的日志
find /logs -name "*.log" -mtime +30 -print0 | xargs -0 rm
- 清理临时文件
find /tmp -name "tmp_*" -print0 | xargs -0 rm -f
多媒体处理
- 批量调整图片尺寸
find . -name "*.jpg" -print0 | xargs -0 -I {} convert {} -resize 800x600 {}
- 转换音频格式
find . -name "*.wav" -print0 | xargs -0 -I {} ffmpeg -i {} {}.mp3
- 生成缩略图
find images/ -name "*.png" -print0 | xargs -0 -I {} convert -thumbnail 100x100 {} thumbs/{}
高级技巧
- 并行压缩文件(4 线程)
find . -name "*.csv" -print0 | xargs -0 -P4 -n1 gzip
- 批量重命名(空格替换为下划线)
find . -name "* *" -print0 | xargs -0 -I {} sh -c 'mv "$1" "$(echo $1 | tr ' ' '_')"' _ {}
- 查找并加密文件
find . -name "*.secret" -print0 | xargs -0 -I {} gpg --encrypt {}
- 统计文件类型分布
find . -type f -print0 | xargs -0 file | cut -d: -f2 | sort | uniq -c
- 批量下载远程文件
find . -name "urls.txt" -print0 | xargs -0 cat | xargs -n1 wget
系统监控
- 查找大文件(>100MB)
find / -size +100M -print0 | xargs -0 du -sh
- 查找所有符号链接
find / -type l -print0 | xargs -0 ls -l
- 检查文件系统错误
find / -xdev -type f -print0 | xargs -0 fsck
开发与调试
- 批量代码格式化(Python)
find src/ -name "*.py" -print0 | xargs -0 black
- 检查语法错误(PHP)
find . -name "*.php" -print0 | xargs -0 -n1 php -l
- 合并所有 Markdown 文件
find docs/ -name "*.md" -print0 | xargs -0 cat > combined.md
网络操作
- 批量上传文件到服务器
find . -name "*.jpg" -print0 | xargs -0 -I {} scp {} user@host:/path/
- Ping 所有找到的 IP 地址
find . -name "ips.txt" -print0 | xargs -0 cat | xargs -n1 ping -c 1
趣味用法
- 生成随机文件名
find . -name "*.old" -print0 | xargs -0 -I {} sh -c 'mv "$1" "$(mktemp $1.XXXXXX)"' _ {}
- 创建文件迷宫
seq 100 | xargs -I {} touch file_{}.tmp && find . -name "*.tmp" -print0 | xargs -0 -n1 ln -s /dev/null
最佳实践
- 处理特殊字符:始终使用
-print0
(find)和-0
(xargs)避免空格/换行问题。 - 并行加速:用
-P N
启动多线程(如-P4
用 4 核)。 - 安全测试:先运行
xargs -t
显示命令,确认无误后移除-t
。
以下是更多 find
与 xargs
的组合示例,涵盖系统安全、数据处理、自动化运维等进阶场景:
系统安全与审计
- 查找全局可写文件(潜在风险)
find / -type f -perm /o+w -print0 | xargs -0 ls -l
- 检查 SUID/SGID 文件
find / -type f \( -perm /4000 -o -perm /2000 \) -print0 | xargs -0 ls -l
- 批量移除恶意隐藏文件(如
.webshell.php
)
find /var/www -name ".*.php" -print0 | xargs -0 rm -vf
复杂条件筛选
- 查找非 root 用户拥有的系统关键文件
find /etc /usr/bin -type f ! -user root -print0 | xargs -0 ls -l
- 查找 1MB~10MB 且 7 天内未访问的 PDF
find ~/Documents -name "*.pdf" -size +1M -size -10M -atime +7 -print0 | xargs -0 ls -lh
- 排除特定目录(如
node_modules
)
find . -name "*.js" -not -path "*/node_modules/*" -print0 | xargs -0 wc -l
数据管理与分析
- 批量提取 CSV 文件的第二列
find data/ -name "*.csv" -print0 | xargs -0 -n1 awk -F',' '{print $2}' > all_columns.txt
- 合并多个日志文件(按时间排序)
find /logs -name "app_*.log" -print0 | xargs -0 sort -n -t ' ' -k4 > merged.log
- 统计所有图片的平均大小
find . -name "*.jpg" -print0 | xargs -0 du -k | awk '{sum+=$1} END {print "Avg:", sum/NR "KB"}'
自动化运维
- 批量重启容器(匹配名称前缀)
docker ps --filter "name=web_*" --format "{{.ID}}" | xargs -I {} docker restart {}
- 清理 Kubernetes 终止的 Pod
kubectl get pods --all-namespaces | grep "Terminated" | awk '{print $2}' | xargs -n1 kubectl delete pod
- 动态扩容磁盘分区(仅限未挂载)
find /dev -name "sd*" -type b -print0 | xargs -0 -I {} growpart {} 1
跨文件系统与网络
- 对比两个目录差异(仅文件名)
diff <(find dir1/ -type f -printf "%P\n" | sort) <(find dir2/ -type f -printf "%P\n" | sort)
- 批量下载 GitHub 仓库(根据
repos.txt
)
find . -name "repos.txt" -print0 | xargs -0 -I {} sh -c 'xargs -I URL git clone URL < {}'
- 同步文件到多个服务器(并行)
find /backup -name "*.tar.gz" -print0 | xargs -0 -P4 -I {} rsync -avz {} user@host1:/backup/ user@host2:/backup/
元数据处理
- 批量删除图片 Exif 信息
find photos/ -name "*.jpg" -print0 | xargs -0 -I {} exiftool -all= {}
- 修改 PDF 创建时间戳
find . -name "*.pdf" -print0 | xargs -0 -I {} touch -t 202301010000 {}
- 提取音频元数据到 CSV
find music/ -name "*.mp3" -print0 | xargs -0 -I {} exiftool -Artist -Title -csv {} > metadata.csv
开发与调试增强
- 批量注入调试代码(Python 函数入口)
find src/ -name "*.py" -print0 | xargs -0 sed -i '/def /a \ print("DEBUG: Entering function")'
- 检测大文件提交到 Git 历史
git rev-list --all | xargs -I{} git ls-tree -r --long {} | awk '$4 > 1000000' | sort -k4 -n
- 批量生成代码文档(Doxygen 风格)
find src/ -name "*.cpp" -print0 | xargs -0 -I {} doxygen -g {} && doxygen Doxyfile
趣味与创意
- 创建随机目录结构(测试用)
seq 1 100 | xargs -I {} mkdir -p "dir_{}/$(openssl rand -hex 6)"
- 将文件名转换为 QR 码
find . -name "*.txt" -print0 | xargs -0 -I {} qrencode -o "{}.png" "$(basename {})"
- 用文件内容生成语音(需
espeak
)
find . -name "greetings.txt" -print0 | xargs -0 -I {} sh -c 'espeak -f {} -w $(basename {} .txt).wav'
性能与错误处理
- 限制文件处理深度(仅 3 层子目录)
find . -maxdepth 3 -name "*.log" -print0 | xargs -0 tail -f
- 忽略
Permission denied
错误
find / 2>/dev/null -name "*.conf" -print0 | xargs -0 grep "password"
- 记录操作日志(带时间戳)
find /opt -name "*.sh" -print0 | xargs -0 -t -I {} sh -c 'echo "$(date): Processing {}" >> audit.log'
容器与虚拟化
- 清理所有退出的 Docker 容器
docker ps -aq --filter "status=exited" | xargs -r docker rm
- 批量导出容器快照
docker ps --format "{{.Names}}" | xargs -I {} sh -c 'docker export {} > {}.tar'
- 查找并压缩虚拟机磁盘文件
find /vm_storage -name "*.vdi" -size +10G -print0 | xargs -0 -P4 gzip
安全增强
- 禁用过期用户的文件
find /home -user $(id -u expired_user) -print0 | xargs -0 chmod 000
- 批量验证文件完整性(MD5)
find /critical -type f -print0 | xargs -0 md5sum > checksums.md5
- 查找潜在 Webshell 文件(短小 PHP 文件)
find /var/www -name "*.php" -size -5k -print0 | xargs -0 file | grep "PHP script"
高效技巧
- 跳过软链接原始文件处理
find . -type f -not -type l -name "*.cfg" -print0 | xargs -0 sed -i 's/#.*//'
- 组合
find
输出为 JSON
find . -printf '{"path":"%p","size":"%k KB"}\n' | jq -s .
- 交互式删除(每个文件确认)
find . -name "*.tmp" -ok rm {} \;
跨平台兼容
- 兼容 macOS/BSD 的权限修复
find . -type d -print0 | xargs -0 stat -f '%N %A' | awk '$2 !~ /755/ {print $1}' | xargs -I {} chmod 755 {}
- 处理带引号的文件名(无
-print0
时)
find . -name "*.md" -print | sed 's/ /\\ /g' | xargs -n1 pandoc -o {}.pdf
扩展思路
- 结合
jq
处理 JSON 日志:
find /logs -name "*.json" -print0 | xargs -0 jq '.error'
- AI 辅助筛选文件(需 API):
find . -name "*.jpg" -print0 | xargs -0 -I {} curl -F "file=@{}" https://api.ai/check
注意事项
- 资源限制:处理大量文件时,用
-n
控制每次传递的参数数量(如-n 100
)。 - 权限隔离:涉及系统目录时,优先使用
sudo
结合-exec
而非xargs
。 - 环境变量:在复杂命令中,用
sh -c '...'
包裹以正确解析变量。