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

Ruby脚本移除文件名数字时遇文件丢失/无法重命名问题求助

Ruby文件名去数字脚本问题修复

原代码的核心问题

  • 条件判断逻辑完全错误:!File.exist?(file)是检查原文件是否不存在,可重命名的前提是原文件必须存在;!file.empty?对原文件名没有意义,应该校验新生成的文件名是否有效。
  • 未处理重名情况:多个文件移除数字后文件名重复,会导致后面的文件直接覆盖前面的,造成文件丢失。
  • 未处理无效文件名:比如原文件叫123,去数字后变成空字符串;或者456.txt变成.txt,这类文件名要么不合法要么不符合常规使用需求。

修复后的完整代码

require 'fileutils'

folder = ARGV[0]
# 先校验传入的文件夹是否存在,不存在直接退出
abort("指定的文件夹不存在,请检查路径!") unless Dir.exist?(folder)

Dir.chdir(folder)
# 遍历所有文件(包括无后缀的),跳过文件夹
Dir.glob("*") do |file|
  next unless File.file?(file)

  # 移除文件名里的所有数字字符
  new_name = file.gsub(/[0-9]/, "")
  
  # 跳过无效的新文件名:空字符串或仅为单个点的情况
  next if new_name.empty? || (new_name.start_with?('.') && new_name.length == 1)

  # 处理重名:如果新文件名已存在,自动添加序号后缀
  counter = 1
  temp_name = new_name
  while File.exist?(temp_name)
    # 拆分文件名主体和后缀
    base_name = File.basename(temp_name, '.*')
    extension = File.extname(temp_name)
    temp_name = "#{base_name}_#{counter}#{extension}"
    counter += 1
  end
  new_name = temp_name

  # 执行重命名并打印日志
  FileUtils.mv(file, new_name)
  puts "重命名完成:#{file} → #{new_name}"
end

修复细节说明

  1. 路径校验:先判断传入的文件夹是否存在,避免程序因无效路径报错崩溃。
  2. 过滤文件夹:只处理文件,不会误改文件夹名称。
  3. 无效文件名过滤:跳过空名字或仅含单个.的情况,避免生成无效文件。
  4. 重名处理:如果新文件名已存在,自动在名称后添加递增序号(比如note.txt存在时,后续文件会变成note_1.txt、note_2.txt),彻底避免文件覆盖丢失。
  5. 日志输出:控制台打印重命名记录,方便确认每一步操作。

内容的提问来源于stack exchange,提问作者Dennis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:37:28