rename命令需用正则锚点(^、$)和转义(如\.),执行前必加-n预览;错误示例s/txt/md/会误改中间字符,正确应为s/\.txt$/.md/;强制覆盖需-f但极危险;无rename时可用for+mv(变量须加双引号)或find+shell组合。

rename 命令怎么用才不踩坑
直接上手 rename 最容易出错的地方是正则表达式没转义、没加锚点,导致改错位置或批量覆盖。比如 rename 's/txt/md/' *.txt 会把 mytext.txt 改成 my.md(中间的 t 和 x 也被替换了),而不是只改扩展名。
正确做法必须用 $ 锚定结尾,并对点号 . 转义:
-
rename 's/\.txt$/.md/' *.txt—— 只替换末尾的.txt -
rename 's/^/backup_/' *.log—— 在所有.log文件名前加前缀(^锚定开头) - 执行前先加
-n预览:rename -n 's/\.old$/.new/' *,输出只是模拟,不改动文件 - 如果目标文件已存在(比如重命名后名字冲突),
rename默认跳过;要强制覆盖,得加-f,但非常危险,慎用
不用安装工具的 for 循环方案
如果你不能装 rename 或只是临时改几个文件,for + mv 是最轻量的选择,但要注意变量展开和空格处理。
Ubuntu 26.04 LTS(代号“Resolute Raccoon”)是Canonical于2026年4月23日发布的下一代长期支持版操作系统,提供长达10年的技术支持。它搭载Linux 7.0内核与GNOME 50桌面环境,全面转向Wayland协议,并引入Rust重写的核心工具以增强安全性。官方提供适用于AMD64和ARM64架构的桌面及服务器ISO镜像,是追求前沿技术与极致稳定的开发者
常见错误:写成 for file in *.txt; do mv $file new_$file; done —— 没引号,遇到带空格的文件名就崩。
- 必须用双引号包裹变量:
for file in *.txt; do mv "$file" "new_$file"; done - 改扩展名要用参数展开:
mv "$file" "${file%.txt}.bak"(${file%.txt}去掉末尾.txt) - 想统一编号?可以用
i=1; for file in *.jpg; do mv "$file" "photo_${i}.jpg"; ((i++)); done - 这个方案不支持正则,只适合固定模式,但胜在无依赖、逻辑透明
mmv 命令适合什么场景
mmv 不是默认安装的,但它对「按结构拆解重命名」特别顺手,比如把 IMG_20230101_001.jpg 改成 2023-01-01-001.jpg 这类带分段提取的操作。
- 先装:
sudo apt install mmv - 基本语法:
mmv "pattern" "replacement",其中#1、#2对应 pattern 中的*或? - 例:把所有
data_*.csv改成export_#1.csv→mmv "data_*.csv" "export_#1.csv" - 它默认不覆盖已有文件,加
-n可预览,加-f才强制覆盖 - 注意:
mmv不支持正则,只认通配符;而且 pattern 必须引号包裹,否则 shell 会提前展开
递归处理子目录里的文件怎么办
上面三个工具都只处理当前目录。如果文件散在多层子目录里,就得靠 find 组合 mv,但这里最容易漏掉的是路径拼接和特殊字符。
- 安全写法:
find . -type f -name "*.log" -exec bash -c 'mv "$1" "${1%.log}.bak"' _ {} \; - 关键点:
"$1"是bash -c的第一个参数,_占位,{}传进来作为$1,避免文件名含空格或换行时出错 -
${1%.log}在子 shell 里有效,但不能直接写find ... -exec mv "{}" "${{}%.log}.bak" \;—— 这种写法语法错误,shell 不解析花括号内的参数展开 - 如果要加前缀且保留完整路径,用
dirname和basename拆分:find . -name "*.tmp" -exec bash -c 'd=$(dirname "$1"); b=$(basename "$1"); mv "$1" "$d/new_$b"' _ {} \;
rename -n 和 mmv -n 能帮你看清,但 for 和 find 写错一行就可能删错文件。动手前先 ls 确认范围,再加预览开关,比事后恢复快得多。










