按后缀名搜索必须用 -name 或 -iname 并加引号防止 shell 展开,如 find /etc -name "*.conf";区分大小写用 -name,不区分用 -iname;安全移动需 -print0 | xargs -0,删除推荐 -delete 但须前置 -type f,跨文件系统操作应加 -xdev。

按后缀名搜索文件必须用 -name 或 -iname
直接写 find /path *.log 是错的——shell 会在 find 执行前就把 *.log 展开成当前目录下匹配的文件,导致 find 收到的是乱序路径而非通配逻辑。正确做法是把模式用引号包住,强制交给 find 解析。
区分大小写时用 -name,比如找严格的小写 .conf 文件:find /etc -name "*.conf";不区分大小写(如匹配 .LOG、.Log)就换 -iname:find /var/log -iname "*.err"。
- 永远对模式加单引号或双引号,避免 shell 提前展开
-
-iname在处理日志归档、用户上传文件等场景更鲁棒 - 后缀带点(如
.tar.gz)要写全:-name "*.tar.gz",不能只写-name "*.gz"(会误中普通.gz)
批量移动文件别直接用 -exec mv,优先考虑 -print0 + xargs -0
find /src -name "*.tmp" -exec mv {} /dst/ \; 看似简单,但遇到含空格、换行符的文件名会出错——{} 不做 shell 转义,mv 会把一个文件名切分成多个参数。
安全做法是让 find 输出 null 分隔路径,再由 xargs 按 null 解析:
find /src -name "*.tmp" -print0 | xargs -0 mv -t /dst/
-t 参数让 mv 把所有输入路径移到目标目录下(GNU coreutils 支持);若系统不支持(如 macOS),改用:
find /src -name "*.tmp" -print0 | xargs -0 -I {} mv {} /dst/
- 路径含空格、括号、中文时,
-print0+-0是唯一可靠组合 - 移动前先用
ls -l验证目标目录权限,避免因无写入权导致部分失败 - 不要省略
/dst/末尾斜杠,否则mv a b可能覆盖成文件而非放入目录
删除特定后缀文件,-delete 比 -exec rm 更快也更安全
find . -name "*.swp" -delete 是最简方案:它在 find 内部直接 unlink,不 fork 新进程,也不依赖 shell。而 -exec rm {} \; 每个文件都起一次 rm,效率低且易受信号中断影响。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
但 -delete 有硬性前提:必须确保匹配结果全是文件(或确定要删目录),且不能和 -prune、-depth 混用不当。常见错误是没加 -type f 导致误删同名目录:
- 删纯文件:
find /tmp -type f -name "*.log" -delete - 删空目录(需配合
-empty):find /cache -type d -empty -delete - 删前务必先跑一遍不带
-delete的命令,确认输出列表无误
跨文件系统移动或删除时,-xdev 是防越界关键
默认 find 会穿越挂载点(如从 / 开始搜,可能进入 /proc、/sys、/mnt/usb)。若只想处理本分区文件,必须加 -xdev:
find /home -xdev -name "*.cache" -delete —— 这样不会误触 /mnt/backup 下同名文件。
这个选项特别容易被忽略,尤其在脚本中复用 find 命令时。一旦漏掉,轻则删错位置,重则触发 NFS 挂起或容器内 /proc 访问异常。
真正难的不是语法,而是每次执行前是否真的看清了 find 实际扫描的路径范围和文件类型边界。

















