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
修复细节说明
- 路径校验:先判断传入的文件夹是否存在,避免程序因无效路径报错崩溃。
- 过滤文件夹:只处理文件,不会误改文件夹名称。
- 无效文件名过滤:跳过空名字或仅含单个
.的情况,避免生成无效文件。 - 重名处理:如果新文件名已存在,自动在名称后添加递增序号(比如
note.txt存在时,后续文件会变成note_1.txt、note_2.txt),彻底避免文件覆盖丢失。 - 日志输出:控制台打印重命名记录,方便确认每一步操作。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

