最稳妥方式是 find . -type f -size 0 -delete,因 -delete 不处理符号链接、需父目录写权限,且 -size 0 默认匹配空文件和空目录,故必须加 -type f 限定。

直接用 find 配合 -size 0 和 -delete 是最稳妥的方式,但顺序、权限和路径边界稍有不慎就会删错或静默失败。
为什么不能只写 find . -size 0 -delete
这条命令看似简洁,但存在两个硬伤:一是 -delete 默认不作用于符号链接(即使指向空文件),二是它隐式要求对父目录有写权限——如果某级目录不可写,find 会跳过其下所有匹配项且不报错。更危险的是,-size 0 会同时匹配空文件和空目录(除非加 -type f 限定)。
- 必须显式加上
-type f,否则可能误删空目录(rmdir才该干这事) - 若目标路径含空格或特殊字符,
-delete仍能安全处理;但若想先预览再删,得换成-print0 | xargs -0 rm - 在 NFS 或某些挂载文件系统上,
-delete可能被禁用,此时必须换用-exec rm {} \;
find 删除前务必先测试匹配结果
永远不要跳过验证步骤。用 -print 或 -ls 看清到底哪些文件会被动到:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
find . -type f -size 0 -print
如果输出太多,加 | head -n 5 快速抽查;若需统计总数,改用:
find . -type f -size 0 | wc -l
-
-ls比-print多显示权限、大小、修改时间,适合排查“为什么这个文件被算进来了” - 加
-maxdepth 1可限制只查当前层,避免误入node_modules或日志子目录 - 排除特定路径用
-path './logs/*' -prune -o组合,比! -path更可靠
带安全确认的批量删除脚本
生产环境建议用 shell 脚本封装,加入 dry-run 模式和用户确认:
#!/bin/bash
DRY_RUN=${1:-"yes"}
if [ "$DRY_RUN" = "yes" ]; then
echo "[DRY RUN] Would delete:"
find . -type f -size 0 -print
echo "Run with 'no' to execute: $0 no"
exit 0
fi
find . -type f -size 0 -delete
echo "Deleted $(find . -type f -size 0 | wc -l) files."
- 脚本第一行检查参数,
$0 no才真正执行删除 -
-delete成功后无输出,所以最后补一句统计——但注意:两次find调用间文件可能被其他进程创建/修改 - 若要兼容老版本 find(如 CentOS 6),把
-delete换成-exec rm {} +,效率略低但更通用
容易被忽略的边界情况
空文件不等于“没用的文件”。有些程序依赖 0 字节占位符(如 .gitkeep、容器健康检查标记文件),盲目清空可能破坏逻辑。
- 检查文件名模式再操作:
find . -type f -size 0 ! -name '.gitkeep' -delete - 某些日志轮转工具生成的空文件,其实是轮转失败信号,删了反而掩盖问题
- ext4 文件系统上,硬链接指向同一 inode 的多个文件名,
-delete只删当前路径名,不影响其他链接——这不是 bug,是预期行为










