在 macOS 系统中,命令行工具为文件管理提供了高效灵活的方式,尤其是批量重命名文件时,通过命令行操作可显著提升效率,本文将详细介绍 macOS 命令行重命名文件的多种方法,包括基础命令、高级技巧及实用案例,帮助用户掌握不同场景下的文件重命名操作。

基础命令与工具
macOS 终端默认支持多种命令行工具,mv 命令是最基础的重命名工具,其语法为 mv [原文件名] [新文件名],将文件 test.txt 重命名为 example.txt,只需输入 mv test.txt example.txt,若需重命名目录,操作方式相同,如 mv old_folder new_folder,需要注意的是,mv 命令会直接覆盖已存在的目标文件,因此操作前需确认文件名唯一性,避免数据丢失。
使用 rename 命令批量重命名
对于批量重命名需求,rename 命令是更高效的选择,macOS 默认安装的 rename 命令基于 Perl 语法,支持正则表达式匹配替换,其基本语法为 rename 's/原模式/新模式/' 文件,将当前目录下所有 .txt 文件扩展名修改为 .md,可执行 rename 's/\.txt$/\.md/' *.txt。s/ 表示替换,\.txt$ 匹配文件名末尾的 .txt,/\.md/ 为替换后的新扩展名。
若需在文件名中添加前缀,如为所有 .jpg 文件添加 photo_ 前缀,可使用 rename 's/^/photo_/' *.jpg,^ 表示字符串开头,删除文件名中的特定字符同样便捷,例如移除所有文件名中的数字 2023,可执行 rename 's/2023//' *。
结合 find 命令处理复杂场景
当需要递归处理子目录中的文件时,find 命令可与 xargs 或 while 循环结合使用,递归将所有 .log 文件重命名为 .bak 文件,可执行 find . -type f -name "*.log" | xargs -I {} mv {} {}.bak,该命令首先通过 find 查找所有 .log 文件,再通过 xargs 将文件名逐个传递给 mv 命令。

更灵活的方式是使用 while 循环,例如为子目录中所有 .png 文件添加 backup_ 前缀:
find . -type f -name "*.png" | while read file; do
mv "$file" "$(dirname "$file")/backup_$(basename "$file")"
done
此命令通过 read 逐行读取文件路径,并用 basename 提取文件名、dirname 提取目录路径,确保重命名操作在原目录中完成。
使用 mmv 扩展工具(需安装)
macOS 默认未安装 mmv 命令,但通过 Homebrew 可轻松获取:brew install mmv。mmv 支持通配符批量重命名,语法更简洁,将所有 file_1.txt、file_2.txt 重命名为 backup_1.txt、backup_2.txt,可执行 mmv "file_*" "backup_#1"。 为通配符,#1 表示引用第一个匹配组。
高级技巧:结合脚本实现自定义重命名
对于复杂重命名规则,可编写 Shell 脚本实现自动化,按修改日期重命名文件:

for file in *; do
if [ -f "$file" ]; then
new_name=$(stat -f "%Sm" -t "%Y%m%d_%H%M%S" "$file")_"$file"
mv "$file" "$new_name"
fi
done
该脚本通过 stat 命令获取文件修改时间,并按 年月日_时分秒 格式添加到文件名前。
注意事项与最佳实践
- 备份文件:批量重命名前建议备份文件,可通过
cp -r 原目录 备份目录创建副本。 - 测试命令:复杂操作时,先用
echo模拟命令结果,确认无误后再执行。echo mv "$file" "$new_name"可预览重命名操作。 - 避免特殊字符:文件名中避免包含空格、、 等特殊字符,或用引号包裹文件名,如
mv "my file.txt" "new file.txt"。
相关问答FAQs
Q1: 如何批量删除文件名中的特定字符串?
A1: 可使用 rename 命令的正则表达式功能,删除所有文件名中的 "old" 字符,执行 `rename 's/old//' *,若需递归处理子目录,可结合find命令:find . -type f -exec rename 's/old_//' {} \;`。
Q2: 重命名时如何忽略大小写差异?
A2: macOS 的 rename 命令默认区分大小写,若需忽略大小写,可使用 perl 的 i 修饰符,将所有 .TXT 文件统一改为小写扩展名,执行 rename 's/\.TXT$/\.txt/i' *,若需修改整个文件名的大小写,可通过 tr 命令实现,如 for file in *; do mv "$file" "$(echo "$file" | tr 'A-Z' 'a-z')"; done。
