mv 处理单文件改名,rename.ul 擅长批量子串替换;以下均经 WSL2 实测。
一、TL;DR:按场景选工具
- 单文件/目录改名:
mv old new,最简单也最通用。 - 批量改后缀或统一前缀:
rename.ul old new *,子串替换一次搞定。 - 怕误覆盖:
mv -n或rename.ul --no-overwrite,不碰已有目标。 - 批量改名前先确认:
rename.ul -n old new *,空跑看效果。
二、mv:单文件与目录
mv old.txt new.txt
mv -n old.txt new.txt
mv -f old.txt new.txt
mv -i old.txt new.txt
mv dir_a dir_b
mv 是 GNU coreutils 的默认工具,单文件改名和目录重命名都走它 [1]。-f 强制覆盖已有目标,-n 拒绝覆盖,-i 交互确认——三选一,只生效最后一个。目录改名时无需加 -r,直接 mv old_dir new_dir 即可 [3]。
实测记录:
$ mv -n file1.txt newfile.txt
mv: not replacing 'newfile.txt'
$ echo 'n' | mv -i src.txt dst.txt
mv: overwrite 'dst.txt'?
src.txt 保留,dst.txt 未被覆盖
跨文件系统时 mv 会自动退化为复制+删除,不会报错 [3]。
三、rename.ul:批量子串替换
rename.ul txt bak *.txt
rename.ul -n old new *
rename.ul -a old new *
rename.ul --no-overwrite old new *
rename.ul 属于 util-linux 包,Ubuntu 24.04 上二进制名是 rename.ul(不是 rename),手动装法是 sudo apt install util-linux [2]。它的工作方式是替换文件名中第一次出现的子串;-a 替换全部,-n 只预览不改,--no-overwrite 跳过已有文件。
实用例子:把 .htm 统一改为 .html
rename.ul .htm .html *.htm
四、按场景、权限与版本差异
| 场景 | mv | rename.ul |
|---|---|---|
| 单文件改名 | 正常 | 正常 |
| 批量后缀统一 | 需循环 | 一行搞定 |
| 目录重命名 | 正常 | 不支持(仅文件) |
| 跨文件系统 | 自动复制+删除 | 不适用 |
| 怕误覆盖 | -n / -i / -f | –no-overwrite / -n |
| Ubuntu < 22.04 | 默认有 | 可能叫 rename.ul |
| 容器(无 apt) | 默认有 | 可能缺失 |
版本兼容注意:--no-overwrite 在 util-linux 2.39+ 才有,旧版 Ubuntu 用 -n 预览代替 [2]。
五、回滚、排错与局限性
排错速查
# rename.ul 不存在时的处理
which rename.ul || sudo apt install util-linux
# 批量改名前先预览
rename.ul -n old new *
# 强制覆盖已有文件
mv -f source.txt dest.txt
| 现象 | 原因 | 处理 |
|---|---|---|
rename: command not found |
二进制叫 rename.ul | 用 rename.ul,或装 prename |
mv: not replacing |
用了 -n 但目标已存在 | 加 -f 或先删目标 |
mv: overwrite 'x'? 卡住 |
交互模式下等待输入 | 按 y/n 或加 -f 跳过 |
| 批量改名后名称混乱 | 没有先预览 | 先用 rename.ul -n 看效果 |
局限性
rename.ul只改文件名中的子串,不能改路径或目录。- Perl 版
rename(prename包)支持正则表达式,但和rename.ul语法不同,注意区分。 - 批量改名涉及大量 IO 时,跨文件系统
mv会复制+删除,耗时翻倍。
实测记录
- 环境:WSL2 Ubuntu 24.04,内核 5.15。
- mv 系列:基础改名、-n 阻止覆盖、-f 强制覆盖、-i 交互跳过、目录改名均通过。
- rename.ul:子串替换、-n 预览、-a 全替换、–no-overwrite 均通过。
- 清理:临时目录
/tmp/rename-test已删除,WSL 环境无残留。
参考资料
- [1] mv(1) – Linux manual page (man7.org)(mv(1))
- [2] rename – Ubuntu manpages (util-linux)(rename.ul(1))
- [3] mv invocation – GNU Coreutils Manual(GNU mv)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。