在Linux系统中,批量修改文件名是日常运维和开发中常见的操作,无论是统一文件命名规范、整理混乱的文件名,还是为文件添加统一标识,都需要掌握高效的重命名方法,本文将详细介绍几种常用的批量重命名文件的方法,涵盖不同场景下的操作技巧。

使用rename命令批量重命名
rename是Linux下专门用于批量重命名的工具,支持基于正则表达式的模式替换,操作高效且灵活,需要注意的是,rename存在两个版本:Perl版本(功能更强大,常见于Ubuntu/Debian)和C版本(语法不同,常见于CentOS/RHEL),本文以更常用的Perl版本为例。
统一添加前缀或后缀
假设当前目录下有文件test1.txt、test2.txt、test3.txt,需为所有.txt文件添加前缀backup_,命令如下:
rename 's/^/backup_/' *.txt
执行后文件名变为backup_test1.txt、backup_test2.txt、backup_test3.txt,若需添加后缀(如_2023),则修改正则表达式:
rename 's/(.txt)$/_2023$1/' *.txt # 保留原扩展名,在.txt前添加_2023
替换文件名中的特定字符
若文件名包含空格或特殊字符(如my file.txt需替换为my-file.txt),可用以下命令:
rename 's/ /-/g' *.txt # 将所有空格替换为连字符
按序号重命名
假设文件名为jpg、jpg…jpg,需重命名为photo_001.jpg、photo_002.jpg…photo_010.jpg,可结合printf格式化:
i=1; for file in *.jpg; do mv "$file" $(printf "photo_%03d.jpg" $i); ((i++)); done
(注:此方法通过bash循环实现,%03d表示3位数字补零,适用于序号重命名场景。)

使用find+xargs+sed处理复杂场景
当需要基于文件属性(如修改时间、大小)筛选文件并重命名时,find命令结合xargs和sed更灵活,将30天前修改过的.log文件添加old_前缀:
find . -name "*.log" -mtime +30 -print0 | xargs -0 -I {} bash -c 'mv "$1" "old_$1"' _ {}
命令解析:
find . -name "*.log" -mtime +30:查找当前目录下30天前修改过的.log文件;-print0:处理文件名中的空格或特殊字符;xargs -0 -I {}:以空字符分隔文件名,占位符代表文件名;bash -c 'mv "$1" "old_$1"' _ {}:通过bash执行重命名,$1对应,_ {}为参数传递。
使用bash循环实现自定义逻辑
对于更复杂的重命名需求(如基于文件内容提取关键词),可通过bash循环结合参数扩展实现,将文件名包含error的.log文件重命名为error_原文件名:
for file in *.log; do
if [[ "$file" == *"error"* ]]; then
newname="error_${file}"
mv "$file" "$newname"
fi
done
此方法可结合grep、awk等工具进一步处理文件名或内容,灵活性极高。
不同方法适用场景对比
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
rename命令 |
简单模式替换(添加前缀/后缀、替换字符) | 语法简洁,效率高 | 复杂正则可能难调试 |
find+xargs+sed |
基于文件属性筛选并重命名 | 支持复杂筛选条件 | 命令较长,需熟悉管道和参数传递 |
bash循环 |
自定义逻辑重命名(如基于内容) | 灵活性最高,可结合任意命令 | 需编写脚本,效率相对较低 |
相关问答FAQs
问题1:文件名包含空格或特殊字符(如my file(1).txt),如何批量重命名?
解答:处理含空格或特殊字符的文件名时,需避免命令解析错误,推荐使用find -print0和xargs -0组合,或用双引号包裹文件名,将所有含空格的.txt文件中的空格替换为下划线:
find . -name "*.txt" -print0 | xargs -0 -I {} bash -c 'mv "$1" "${1// /_}"' _ {}
${1// /_}是bash的参数扩展,表示将$1中的所有空格替换为下划线。

问题2:如何只修改特定扩展名的文件名,保留其他文件不变?
解答:可通过find或通配符精确匹配扩展名,仅将.jpg文件重命名为image_原文件名.jpg,其他文件(如.png)不变:
rename 's/(.jpg)$/image_$1/' *.jpg # 使用通配符*.jpg限制范围
或使用find指定扩展名:
find . -type f -name "*.jpg" -exec bash -c 'mv "$1" "image_$1"' _ {} ;
-type f确保只处理文件(不处理目录),-exec直接执行重命名命令,避免通配符匹配其他类型文件。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/24389.html