perl版rename支持正则且安全,推荐用单引号包裹、锚定行尾并先-n预览;gnu版仅字面替换易误改;for+mv方案更通用,需注意空格、nullglob及边界文件名问题。

确认你用的是哪个 rename 版本
直接运行 rename --version,结果决定你下一步怎么写命令:
输出含 perl 或 File::Rename → Perl 版(支持正则,推荐)
输出含 util-linux → GNU/C 版(只做字面替换,容易误改)
很多 CentOS/RHEL 8+ 默认装的是 GNU 版,但没装 Perl 版——这时 rename 's/\.txt$/.md/' *.txt 会报错或静默失败。
rename Perl 版安全改后缀的写法
核心是确保只改结尾的后缀,不碰文件名里可能存在的相同字符串。关键点:
• 必须用单引号包裹正则表达式,防止 shell 提前展开 $
• \.txt$ 中的 \. 转义点号,$ 锚定行尾
• 先加 -n 预览: rename -n 's/\.txt$/.log/' *.txt
• 确认无误后再执行真实操作
• 如果文件在子目录,用 find . -name "*.txt" -exec rename -n 's/\.txt$/.log/' {} +
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
不用 rename 时,for + mv 的可靠写法
兼容所有 shell 和系统,尤其适合不确定 rename 是否可用的环境:
• 使用 Bash 参数扩展:${file%.txt} 安全剥离后缀,比 basename 或 sed 更轻量
• 必须双引号包裹变量:"$file" 和 "${file%.txt}.md",否则空格、括号、中文会出错
• 通配符 *.txt 若无匹配,会原样传给 for,导致尝试重命名字面量 *.txt —— 加 shopt -s nullglob 可避免
• 执行前建议先 echo 模拟:for file in *.txt; do echo mv "$file" "${file%.txt}.md"; done
容易被忽略的边界情况
真正出问题的往往不是语法,而是这些细节:
• 当前目录下混入了非目标文件(比如 notes.txt.bak 会被 *.txt 匹配到,但 ${file%.txt} 会错误地变成 notes.txt.bak → notes.txt.bak.md)
• 文件名含多个点(如 archive.tar.gz),${file%.txt} 不适用,得用 ${file%.*} 或正则
• rename 对大小写敏感,.TXT 不会被 *.txt 匹配,需额外处理
• 没备份就直接操作,一旦出错难以回退——建议先 cp -r 备份目录或用 mv -b 自动备份










