You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby脚本修改文件扩展名问题:控制台代码移入脚本后异常

解决Ruby脚本中调用rename命令的字符串插值问题

看来你是想用Ruby脚本调用系统的Perl风格rename命令批量修改文件扩展名,但遇到了字符串转义和插值的坑。我来帮你拆解问题并给出修复方案:

问题根源

你原来的代码里,'s/\#{ARGV[0]}$/\#{ARGV[1]}'这部分有两个关键错误:

  • 在Ruby单引号字符串中,\#会被解析成字面量的#,直接阻止了#{ARGV[0]}的变量插值,导致命令里的参数根本不会被替换成实际值
  • 就算换成双引号,你转义#的操作也完全没必要——你要的是匹配文件名结尾的扩展名,而不是#字符,转义反而让正则逻辑出错

修复后的Ruby脚本代码

正确的做法是用Ruby的字符串插值构造rename命令的正则部分,同时注意正则的严谨性(比如转义扩展名的.,避免误匹配文件名中间的字符):

# 先校验参数数量,避免用户传参错误
if ARGV.size != 2
  puts "用法: ruby rename_ext.rb <原扩展名> <新扩展名>"
  exit 1
end

old_ext = ARGV[0]
new_ext = ARGV[1]

# 构造Perl风格的rename命令:注意正则里的\.转义点,$匹配文件名结尾
rename_cmd = "rename 's/\\.#{old_ext}$/.#{new_ext}/' *.#{old_ext}"

# 执行系统命令
system(rename_cmd)

补充说明

  1. 调用示例:比如要把所有.txt文件改成.md,直接在控制台执行:
    ruby rename_ext.rb txt md
    
  2. 正则严谨性:\.用来精确匹配扩展名前的点,$确保只替换文件名末尾的扩展名,不会误改文件名中间包含原扩展名的文件(比如notes.txt.bak不会被误处理)

更Ruby化的替代方案(不依赖系统命令)

如果你担心不同系统的rename行为不一致(比如部分系统是原生rename而非Perl版本),可以用纯Ruby实现批量重命名,兼容性更好:

if ARGV.size != 2
  puts "用法: ruby rename_ext.rb <原扩展名> <新扩展名>"
  exit 1
end

old_ext, new_ext = ARGV

# 遍历所有符合原扩展名的文件
Dir.glob("*.#{old_ext}").each do |file|
  # 替换扩展名
  new_file = file.gsub(/\.#{old_ext}$/, ".#{new_ext}")
  File.rename(file, new_file)
  puts "已重命名: #{file} → #{new_file}"
end

这种写法完全用Ruby原生API,没有系统命令依赖,也不会有字符串转义的烦恼~

内容的提问来源于stack exchange,提问作者M.use

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:49:38