上周同事找我帮忙整理相机里六百多张照片,第一件事就是在统信UOS上批量重命名。很多人觉得批量重命名不就是改个文件名嘛,真到自己手上一批文件叫IMG_20231015_093021.jpg、IMG_20231015_093102.jpg的时候,才知道"统信UOS批量重命名"这事有不少讲究。有人只会一个个F2重命名,有人到处找第三方插件,其实从系统自带文件管理器到终端命令,再到图形化批量工具,至少有四种成熟玩法。这篇文章把我实测过的方案和踩过的坑都写出来,只想用鼠标解决的人直接看第一章,会一点Linux的人重点看第二、三章,经常处理成百上千个媒体文件的人,建议直接跳到第四章。
1. 先用文件管理器兜底:人人都会的图形化批量重命名
1.1 选中一批文件,右键里藏着批量重命名入口
在统信UOS桌面上打开文件管理器,进入目标目录,先按住Ctrl键点击选中多个文件,或者按住Shift键选中一段连续文件,也可以在空白处按住鼠标左键拖动框选。选中之后,右键菜单里会多出一个"重命名"选项。注意,这个"重命名"和单个文件的"重命名"是两个东西:单个文件时,F2会直接进入文件名编辑;多个文件时,右键点击"重命名"弹出的不是简单的输入框,而是一个批量重命名窗口。
我见过不少人在UOS上卡在这一步,半天找不到批量重命名入口,其实就是没选多个文件,或者选了之后下意识按了F2,结果只改了一个文件。窗口上半部分是文件列表预览,下半部分是重命名规则区,桌面环境不同版本之间菜单位置可能略有差异,但入口基本都在右键菜单里,这一点没变过。
1.2 替换文本和添加序号两种模式怎么用
在批量重命名窗口里,主要能看到"替换文本"和"添加序号"两大类规则,不同版本可能还会有"修改大小写""自定义模板"这些附加选项。
替换文本模式适合清洗文件名里的杂质。比如下载的文件叫"会议纪要(1).docx""会议纪要(2).docx",你想把括号和数字去掉,直接在"查找内容"里填"(1)","替换为"留空,预览就会变成"会议纪要.docx""会议纪要(2).docx"。注意这种操作只匹配一个固定字符串,如果想同时去掉"(1)"和"(2)",在图形界面里反而麻烦,不如后面说的rename命令一个正则搞定。
添加序号模式适合统一给文件加编号。你可以选择序号加在名称前还是名称后,设置起始值、步长、位数。比如把"report.pdf"改成"report_01.pdf""report_02.pdf",或者把整个文件名改成"2024_报告_001""2024_报告_002"。很多版本里用#作为位数占位符,想生成两位序号就写##,四位就写####,具体写法不同版本略有差异。操作时一定先看预览,确认位数和文件名的组合不别扭再执行。
还有一个小选项经常被忽略:规则作用范围是"名称""扩展名"还是"名称和扩展名"。默认只改名称,扩展名保持不变,这样最安全。如果你确实想批量改后缀,比如把.JPG改成.jpg,就需要把作用范围切到"名称和扩展名"或者专门的后缀选项。
1.3 文件管理器方案的局限:什么时候该换工具
文件管理器内置方案的最大优点是零学习成本,所见即所得,适合一次处理十几、几十个文件。但它的局限也很明显。第一,不支持正则表达式,无法表达"把所有数字开头的文件统一去掉前导零"这种规则。第二,序号功能比较基础,不能按文件的修改时间排序后加序号,因为文件管理器排序规则是按名称,而不是按时间。第三,规则单一,不能在一次操作里同时做替换、加前缀、改扩展名。
我实际测试还发现一个体验问题:当文件数量超过几百个时,批量重命名窗口的预览会变得有点卡,尤其是一边加载文件图标一边渲染新文件名,操作起来不如命令行顺畅。所以文件管理器方案比较适合临时救急,真正长期要跟大量文件打交道,还是得掌握后面几种方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. rename命令:一行正则处理九成替换需求
2.1 先分清UOS上rename是哪个版本,语法差很远
Linux下叫rename的命令其实有两个血缘,一个来自util-linux包,语法非常简单:rename 原名 新名 文件列表,本质上就是固定的字符串替换;另一个来自Perl社区,语法是rename 's/规则/替换/' 文件列表,支持完整的Perl正则表达式。
统信UOS的软件仓库继承自Debian体系,默认安装的rename通常是Perl版本。但为了保险,我建议在任何脚本里用之前,先执行一句:
bash复制rename -V
如果输出里能看到Perl相关字样,说明是Perl版本,可以使用s/旧/新/这种写法。如果显示的是rename from util-linux,那是另一套语法,上面的写法就会报错。我见过有人从网上一篇老教程里抄来rename 's/\.txt$/\.md/' *.txt,在自己机器上却完全没反应,甚至报错rename: unknown option -- s,原因就是版本错位。
用Perl版本时,'s/旧/新/'是替换操作,-n是试运行,-v是显示详细过程。这几个参数没弄明白之前,千万别直接对着真实文件名跑。
2.2 四个高频命令示例:改后缀、去空格、加前缀、补零
我整理了四个最常用的场景,可以直接复制到UOS终端里改改用。
场景一:把所有.txt扩展名改成.md。
bash复制rename 's/\.txt$/.md/' *.txt
\.表示转义后的点号,因为在正则里.是"任意字符",不转义会把atxt、btxt这类文件也匹配进去。末尾的$表示匹配字符串结尾,进一步缩小范围,避免误伤readme.txt.backup这类文件。
场景二:把文件名里的空格全部替换成下划线。
bash复制rename 's/ /_/g' *
结尾的g表示全局替换,不写的话,每个文件名只会替换第一处空格。这个命令在处理从Windows同步过来、名字里带空格的文件时特别常用。
场景三:给一批文件加前缀。
bash复制rename 's/^/backup_/' *.jpg
^匹配文件名开头,这里的效果是在所有jpg文件名前加上backup_。同理,如果想把^换成$,就是在文件名末尾追加内容。
场景四:把一位编号补成三位。
bash复制rename 's/^(\d+)$/sprintf("%03d", $1)/e' *.txt
这个用了Perl的/e求值功能,把01.txt、2.txt改成001.txt、002.txt。这里(\d+)是捕获括号,把匹配到的数字存到$1里,然后用sprintf("%03d", $1)重新格式化。类似的玩法还有批量改大小写、按日期加前缀,关键点是要理解正则里的捕获括号和$1的配合。
还有一个实用技巧:当替换文本本身包含斜杠时,可以用#当定界符。比如想在文件名前加上目录前缀dir/,写成rename 's#^#dir/#' *就不会和正则的斜杠冲突。
2.3 为什么必须先用 -n 试跑
我一直强调一个习惯:任何批量重命名命令,先加-n参数跑一遍,只显示将要改成的名字,不实际执行。比如:
bash复制rename -n 's/ /_/g' *
输出会一条条列出1 报告.txt -> 1_报告.txt这样的映射。确认没有把不该改的文件卷进去,再把-n去掉正式执行。rename -v可以在执行时打印结果,方便对账。
千万别小看这一步,我踩过最惨的一次坑,是一条正则把几十个文件里的年份数字全删了,当时少了-n直接执行,最后靠备份才救回来。现在我的原则是:写正则五秒钟,试运行三十秒,绝对不会亏。如果文件分散在多层子目录里,还想用rename递归处理,可以配合find命令:
bash复制find . -type f -name "*.txt" -exec rename 's/\.txt$/.md/' {} \;
这样每个匹配到的文件都会被单独交给rename处理,文件名里有空格也不会被拆开,因为{}是一个整体参数。
3. Shell脚本+mv:按日期、按序号、按规则自定义批量重命名
3.1 从照片创建日期批量生成文件名
rename命令灵活,但遇到"根据每个文件的元数据生成新文件名"这种场景,还是脚本更直接。比如我想把一批相机照片按拍摄日期重新命名,利用文件系统里记录的mtime或ctime就能实现,不必去解析EXIF。
bash复制#!/bin/bash
for f in *.jpg; do
date_part=$(stat -c %y "$f" | cut -d' ' -f1)
mv "$f" "${date_part}_${f}"
done
这个脚本遍历当前目录下所有jpg文件,用stat获取修改时间,cut截取日期部分,再拼到原文件名前面。执行完,文件就变成2024-05-06_IMG_0001.jpg这种样子。如果你想按拍摄时间而不仅仅是修改时间,复杂一点的做法是装exiftool读取EXIF,或者直接用后面讲到的KRename元数据功能。
不过有一个细节要注意:stat -c %y输出的是2024-05-06 10:30:21.123456789 +0800这种格式,用cut -d' ' -f1取第一段没问题。如果脚本在非中文locale环境下运行,日期格式可能变成05/06/2024,这样拼出来的文件名排序就不直观。所以我更推荐先把日期统一成年-月-日:
bash复制date_part=$(date -d @"$(stat -c %Y "$f")" +%Y-%m-%d)
stat -c %Y取的是Unix时间戳,date -d @时间戳再把时间戳转成指定格式,输出永远是2024-05-06,不受locale影响。
3.2 用循环给文件加三位序号
另一个高频需求是按某种顺序加序号,比如把文件按名称排序后依次编号。
bash复制i=1
for f in *.png; do
new_name=$(printf "%03d_%s" "$i" "$f")
mv "$f" "$new_name"
i=$((i + 1))
done
printf "%03d" "$i"会把1输出成001,这样排序时就不会出现10排在2前面的尴尬。注意,i=$((i + 1))是Shell整数运算,不能写成i=$i+1,那只会把字符串拼起来。如果想从0开始、步长2,就改成i=$((i + 2)),起始值在循环前赋值就好。
这里还隐藏着一个Shell通配符的坑:如果当前目录下没有任何png文件,for f in *.png会把字面量*.png当成文件名传给循环体,导致脚本对一个不存在的文件执行mv然后报错。稳妥做法是在脚本开头加一行:
bash复制shopt -s nullglob
nullglob开启后,没有匹配文件时通配符会展开成空列表,循环体直接不执行,脚本更安全。
3.3 处理子目录和空格文件名,脚本才算是生产级
上面两个脚本在文件名带空格、中文、特殊字符上都有讲究。初次写脚本的人最容易掉进一个坑:文件名里有空格,mv "$f" "$new_name"里如果不加双引号,Shell会把1 报告.txt拆成1和报告.txt两个参数,直接报错或者产生奇怪结果。所以写脚本时,凡是引用文件名的位置,一律加双引号。
如果还要递归处理子目录,for f in *.jpg只匹配当前目录。这时候可以换成find:
bash复制find . -type f -name "*.jpg" -print0 | while IFS= read -r -d '' f; do
date_part=$(date -d @"$(stat -c %Y "$f")" +%Y-%m-%d)
mv -- "$f" "${date_part}_${f}"
done
-print0和-d ''配对,是为了让文件名里的空格、换行都不成为问题。这套组合是处理批量文件比较"生产级"的写法,虽然看着绕,但确实稳。脚本写完后,建议先把mv命令换成echo,打印出所有要执行的命令检查一遍,确认没问题再改回来运行。
我还会在mv前面加--,虽然文件名以减号开头的情况不多,但真遇到-wechat_backup.zip这种文件时,没有--的话mv会把文件名当成选项解析,报错说参数不合法。加上--表示后面的内容不再解析为选项,这是一劳永逸的写法。
4. 装个KRename或GPRename:可视化的重型批量重命名工具
4.1 工具对比与安装命令
如果觉得命令行终究不直观,UOS上还能装图形化的批量重命名工具。我实测过两款:KRename和GPRename。这个表格可以帮大家快速选型。
| 工具 | 定位 | 界面依赖 | 体积 | 支持正则 | 根据元数据生成新名 |
|---|---|---|---|---|---|
| KRename | 全能型批量重命名 | KDE | 较大 | 支持 | 支持,包括音视频、图片元数据 |
| GPRename | 轻量型批量重命名 | GTK | 较小 | 支持基本规则 | 不支持很复杂元数据 |
KRename功能非常丰富,几乎把命令行能力都搬进了图形界面,甚至有插件可以从MP3标签或图片EXIF里读取艺术家、日期等信息。代价是要装一堆KDE库。GPRename更轻,界面干净,适合改改名字里的替换文本、加序号这些日常需求。安装方法都差不多,在终端里执行:
bash复制sudo apt update
sudo apt install krename
如果软件源里没有krename,也可以试sudo apt install gprename。装好之后,在启动器里搜索KRename或GPRename就能打开。UOS家庭版里需要先保证软件源能正常使用,安装过程可能需要几分钟,耐心等一下。
4.2 KRename实操:从添加文件到预览改名
KRename的界面不算复杂,左边选择一个目录,中间能勾选要处理的文件,右侧是规则面板。我通常的操作流程是:
- 先选择目标文件夹,通过"添加文件"或直接把文件拖进文件列表。
- 在"文件名"页签里设置规则。这里有一个关键概念:KRename把操作分成"插入""删除""替换""正则"四类,你可以把多个操作排序执行,比如先删除某个字符串,再插入前缀,最后把字母全改成大写。
- 用"编号"功能把文件按规律加序号,起始值和步长都可以设置。
- 看下方的"新文件名"预览,确认无误后点"重命名"。
KRename里还有"文件名占位符"的概念,比如[Date]表示日期、[Time]表示时间、[FileCounter]表示计数器,用来拼接成2024-05-06_[FileCounter]_演唱会.jpg这种组合,比手写shell省事多了。这种占位符在批量处理音乐、图片等多媒体文件时尤其好用,能从ID3标签或EXIF里直接取值。
实际使用中还有一个细节:KRename默认会保留原始扩展名,除非你在规则里明确改了扩展名。这个设计我觉得很贴心,避免了一不小心把文件后缀改坏的情况。它还能在重命名之前生成一个"撤销脚本"或者导出重命名映射表,对需要留痕、归档的场景很实用。
4.3 GPRename适合轻量场景,界面更简单
GPRename打开之后更像一个表单:左边选文件,右边选"模式",比如"替换""添加""去除""重编号"等,在输入框里填写规则,再点击"重命名文件"。它的优点是几乎没有学习成本,适合只偶尔批量重命名、不想打开终端也不想研究KDE依赖的人。
对我个人来说,如果只是把一批.JPG后缀改成.jpg,或者给几十个文档统一加前缀,GPRename就够了;一旦想根据照片拍摄日期、MP3专辑信息生成文件名,我会毫不犹豫用KRename。这里也提醒一句:图形工具虽然直观,但处理几百个文件时同样要先看预览,KRename和GPRename都有明显的预览区域,养成执行前扫一眼的习惯,能省下后面很多恢复工作。
5. 我踩过的坑:中文文件名、隐藏前缀、权限不足和缓存不刷新
5.1 中文文件名在终端里乱码或识别不了
在UOS上批量重命名,最容易出问题的对象就是中文文件名。文件名里的空格、中文、特殊字符,在终端里都会被Shell的特殊规则干扰。第一原则:该加引号就加引号,能用正则就尽量避开直接输入中文。
比如我想把所有包含"报告"的文件改名,用rename 's/报告/总结/' *.docx通常没问题,但一旦遇到中文标点符号,比如全角括号、句号,在正则里也要注意转义。终端里如果看到文件名变成一堆?或者乱码,多半是locale环境变量的问题,可以用locale命令检查,优先保证系统是zh_CN.UTF-8。还有一个容易被忽略的点:从Windows复制过来的文件,中文文件名可能是GBK编码,在UOS里看起来是乱码,这属于文件名编码问题,要先转码再重命名,而不是直接去改文件名。
5.2 mv命令把带空格文件名拆成两半
这是脚本新手最常踩的坑。假设有个文件叫2024 年报.docx,执行mv $f $new_name而不带引号,Shell会把$f扩展成两个词,命令变成mv 2024 年报.docx 2024_年.docx,于是系统试图把"2024"重命名为"2024_年.docx",再把"年报.docx"当作另一个文件,结果完全不是你要的效果。所以脚本中所有引用变量的地方都加双引号,这是批量重命名脚本的第一纪律。
5.3 以-开头的文件名被当成选项
如果文件名本身以减号开头,比如-wechat_backup.zip,直接执行mv -wechat_backup.zip new.zip,mv会认为-wechat_backup.zip是一个命令行选项并报错。常用的解法是在参数前加--,表示后面的内容不再解析为选项:
bash复制mv -- -wechat_backup.zip backup.zip
批量脚本里同样适用。这个问题虽然不常遇到,但一旦遇到会让人卡很久。顺带提一句,rename命令同样支持--,如果你在循环里用rename处理以减号开头的文件,也可以加。
5.4 批量重命名后文件管理器不刷新
在UOS的文件管理器里批量重命名之后,偶尔会出现列表还是旧名字、或者新名字没有即时显示的情况。这不是改名失败,多半是文件管理器缓存没有刷新。按一下F5,或者切换到其他目录再切回来,基本就能解决。如果用的是外部工具如KRename,改完名后回到文件管理器,也要养成刷新一下的习惯,避免误判。特别是在Samba共享目录或U盘上操作时,文件管理器刷新慢的情况会更明显,耐心等一两秒再重新打开目录。
5.5 建议先做只读演练或者备份
最后说一个通用习惯:不管你用哪种方式,在真正执行批量操作之前,最好先做一次"只读演练":文件管理器方案就看预览;rename命令加-n;shell脚本就先echo输出改名映射;KRename在重命名前也有预览。更稳妥的做法是先把这批文件复制到临时目录,在副本上试一遍规则,确认没问题再对真实文件操作。如果文件非常重要,还可以用cp在同目录下建一个带日期的备份文件夹,重命名完成后观察两天没问题再删。
我自己的习惯是命令执行完立刻用ls -l抽查几个文件,名字、扩展名、时间都符合预期,才算真正完成任务。如果让第一次上手统信UOS批量重命名的朋友选一个最终方案:十来个文件,直接在文件管理器里改;规则简单数量又比较大,就用rename;涉及日期和序号、还要跑子目录,就写shell脚本;几百个以上或者带音乐、照片元数据,直接上KRename。工具不在多,把一两种用熟,效率自然翻倍。
