mac终端可用系统自带for循环安全批量重命名,如为pdf加前缀“2026q3_”执行for f in *.pdf; do mv "$f" "2026q3_$f"; done,加后缀用${f%.pdf}_final.pdf截尾拼接,替换字符串用[[ -f "$f" ]] && mv "$f" "${f/_old/}"或sed,推荐zmv命令预览执行更安全,深层目录则用find+rename组合。

你在Mac终端里需要一次性重命名几十个文件,比如把“IMG_001.jpg”改成“vacation_001.jpg”,或者批量删掉所有文件名开头的“draft_”,但又不想打开访达点来点去、也不敢乱敲命令怕误删——系统自带的for循环就能安全完成,不需要额外安装任何工具。
用for循环批量添加前缀或后缀
这一步适合统一加时间戳、项目代号或版本标识,比如把所有PDF加前缀“2026Q3_”。
打开终端 → 输入cd后拖入目标文件夹 → 回车进入目录。
执行命令:for f in *.pdf; do mv "$f" "2026Q3_$f"; done——引号包裹$f是必须的,否则含空格的文件名会断裂成多个参数导致报错。
如果要加后缀,例如把“report.pdf”变成“report_FINAL.pdf”,就用:for f in *.pdf; do mv "$f" "${f%.pdf}_FINAL.pdf"; done。这里${f%.pdf}会精准截掉最后一个“.pdf”,再拼上新后缀,避免出现“report.pdf_FINAL.pdf”这种错误叠加。
用for循环批量替换文件名中的特定字符串
当你下载的一批素材文件名里都混着“_old”“_v1”“copy_of_”这类冗余词,想一键清理时,这个方法比访达“替换文本”更可控,尤其适合嵌套子目录外的扁平化整理。
方法一:只处理当前目录下所有文件(不含子文件夹)
运行:for f in *; do [[ -f "$f" ]] && mv "$f" "${f/_old/}"; done
【注意:下划线在shell中是通配符,必须用反斜杠\转义或放在引号里,否则可能匹配到意外字符】
方法二:带条件判断,跳过非文件项(如误选了文件夹)for f in *; do [ -f "$f" ] && mv "$f" "$(echo "$f" | sed 's/_v1//g')"; done
这条命令调用sed做全局替换,支持正则,比如s/_[0-9]\+//g能删掉所有下划线加数字组合(_123、_45等)。
用zmv命令实现安全批量重命名(推荐Catalina及以上系统)
zmv是zsh内置模块,自带预览、防覆盖、路径安全处理能力,比裸写for循环少踩80%的坑,尤其适合新手或处理重要资料。
第一步:启用zmv模块
在终端输入autoload -Uz zmv并回车,仅需执行一次,当前会话即生效。
第二步:模拟运行看效果
输入zmv -n '(*).JPG' '$1.jpg'——-n参数表示只显示将要执行的操作,不真正改名。你会看到类似IMG_001.JPG -> IMG_001.jpg的预览列表,确认无误再删掉-n执行。
第三步:正式执行zmv '(*).JPG' '$1.jpg',所有大写.JPG立刻转为小写.jpg,且自动跳过同名冲突(比如已有IMG_001.jpg时不会覆盖)。
如果要批量删掉文件名中固定位置的字符,例如统一去掉前4位数字和下划线(“2026_report.pdf”→“report.pdf”),就用:zmv -n '([0-9]{4})_(*)' '$2',其中[0-9]{4}精确匹配四位数字,_字面匹配下划线,$2取第二个括号内容。
用find + rename组合处理深层目录文件
当你要改的文件分散在多层子文件夹里,比如“/Photos/2024/01/IMG_001.jpg”“/Photos/2024/02/IMG_002.jpg”,访达和基础for循环都搞不定,就得靠find定位 + rename执行。
第一步:检查是否已安装rename
终端输入rename --version,若提示command not found,则先运行brew install rename(需已装Homebrew)。
第二步:查找并模拟重命名
执行:find . -type f -name "IMG_*" -exec rename -n 's/IMG_/vacation_/g' {} \;
这里-type f确保只处理文件,-name "IMG_*"限定范围,-n预览结果,{}代表每个找到的文件路径。
第三步:确认无误后去掉-n执行真实操作:find . -type f -name "IMG_*" -exec rename 's/IMG_/vacation_/g' {} \;
【关键提醒:find命令里的路径点“.”代表当前目录及所有子目录,执行前务必cd到正确父目录,否则可能误改系统文件】











