linux批量改文件名推荐四种方法:1. rename正则替换(最常用);2. for循环+mv(最灵活);3. find+exec递归处理;4. mmv模式映射(适合结构化重命名)。

Linux 中批量修改多个文件名,核心是选对工具、写对规则、避开常见坑。关键不在于命令多复杂,而在于匹配是否准确、操作是否安全。下面这几种方法覆盖绝大多数日常场景,按推荐顺序排列。
用 rename 命令做正则替换(最常用)
rename 是专为批量重命名设计的命令,支持 Perl 风格正则表达式,简洁高效。但要注意:不同系统预装版本不同,Ubuntu/Debian 默认是 Perl 版,CentOS/RHEL 默认是 util-linux 版(只支持字符串替换)。使用前先运行 man rename 确认语法。
- 把所有 .txt 改成 .log:
rename 's/\.txt$/.log/' *.txt - 去掉所有文件名开头的 temp_:
rename 's/^temp_//' temp_* - 把空格全换成下划线:
rename 's/ /_/g' * - 给所有文件加前缀 backup_:
rename 's/^/backup_/' *
用 for 循环 + mv 命令(最灵活)
当 rename 不可用,或需要加入判断逻辑(比如只处理大于 1MB 的文件)、格式化编号(如 img001.jpg)、或调用其他命令时,for 循环更可控。
- 按顺序重命名所有 .jpg 为 img001.jpg、img002.jpg…:
counter=1; for f in *.jpg; do mv "$f" "img$(printf "%03d" $counter).jpg"; ((counter++)); done - 只对普通文件加后缀 .old:
for f in *; do [[ -f "$f" ]] && mv "$f" "${f}.old"; done - 添加当前日期前缀(如 20261008_):
for f in *; do mv "$f" "20261008_$f"; done
用 find + -exec 递归处理子目录
当文件分散在多层子目录中,需要一并重命名时,find 是唯一可靠的选择。它能精准定位路径,再调用 rename 或 mv 执行。
- 把整个 logs/ 目录树下所有 .log 文件改为 .bak:
find logs/ -type f -name "*.log" -exec rename 's/\.log$/.bak/' {} \; - 仅对 config/ 下的 nginx.conf 添加时间戳后缀:
find config/ -type f -name "nginx.conf" -exec mv {} {}.20261008 \;
用 mmv 命令做模式映射(适合结构化重命名)
mmv 用通配符和编号引用(#1、#2)实现源名到目标名的映射,语义清晰,特别适合有固定分隔符的文件名,比如 user_id_date.txt → date_user_id.txt。
- 安装(如未安装):
sudo apt install mmv(Debian/Ubuntu)或 sudo yum install mmv(RHEL/CentOS) - 把 file_123.txt 改成 doc_123.txt:
mmv "file_*.txt" "doc_#1.txt" - 交换下划线分隔的第一、二段:
mmv "*_*_*.txt" "#2_#1_#3.txt"











