批量重命名属于「永远停留在 Stack Overflow 标签页里」那种事。shell 里有六七种做法——mv 配 for 循环、rename、prename、mmv、find -exec——而它们在不同发行版之间的差别都细致而恼人。
1. 加日期前缀
clai
$ clai 给所有 .jpg 文件加上今天的日期前缀→ for f in *.jpg; do mv -- "$f" "$(date +%Y-%m-%d)_$f"; done2026-04-27_DSC_0001.jpg2026-04-27_DSC_0002.jpg
-- "$f" 做了真正的事——不让 mv 把以横线开头的文件名当成参数。自己写循环时容易漏。
2. 换扩展名
clai
$ clai 把这个目录下所有 .jpeg 改成 .jpg→ for f in *.jpeg; do mv -- "$f" "${f%.jpeg}.jpg"; done
纯 shell 参数展开,不依赖外部工具。Linux 和 macOS 行为一致——rename 在两边可不一定。
3. 空格规范化
clai
$ clai 把所有文件名里的空格换成下划线→ for f in *\ *; do mv -- "$f" "${f// /_}"; donemy report.pdf -> my_report.pdfproject notes 2026.txt -> project_notes_2026.txt
glob *\ * 只匹配含空格的文件,没有就不进循环。CliAI 经常加这种小护栏。
何时 clai 比 Bash 一行更划算
任何超出这些模式的事——大小写转换、regex 捕获、递归子树改名——直接用大白话说,让模型组合正确的 find -exec rename 's/.../...' '{}' + 或 mmv。结果你反正要读,先审后跑就是安全网。