SystemStackError w /批量文件扩展名在Ruby中重命名

时间:2014-06-20 16:09:48

标签: ruby file rename bulk

这是我的基本脚本,用于重命名从给定目录开始的文件文件树:

require 'fileutils'

module Renamer
  class Application
    def initialize
      @directory = Dir.pwd
    end

    def rename(dir, extension, change_to)
      Dir.glob("#{dir}").each do |f|
        next if %w(. ..).include? f

        if File.directory? f
          rename f, extension, change_to
        else
          puts "Renaming file: #{f}"
          FileUtils.mv f, "#{File.dirname(f)}/#{File.basename(f, '.*')}.#{change_to}" if File.extname f == ".#{extension}"
        end
      end
    end

    def start
      puts 'What file extension do you want to change?'
      extension = gets.chomp
      puts 'What do you want to change it to?'
      change_to = gets.chomp

      rename @directory, extension, change_to

      puts 'Renaming completed!'
    end
  end

  app = Application.new
  app.start
end

由于某种原因,它会在第11行抛出一个SystemStackError,这对我来说很奇怪。如果在Dir.glob方法中,我只是在dir变量旁边放置一个连接的并置,并删除" if"在实际重命名文件的语句上的修饰符,当前目录中的所有文件都被重命名但不在其他任何地方,因为我没有挖掘到其他目录,并且还告诉我代码是有用的。如何解决这个错误?

1 个答案:

答案 0 :(得分:0)

块开头的简单p f显示问题。 Dir.glob扩展文件全局,但您只传递Dir.pwd(没有全局)。所以你的cwd被传递给重命名,它肯定是一个目录,所以它立即传递给自己再次重命名,提示无休止的递归和堆栈错误。

如果您将其更改为Dir.glob("#{dir}" + "/*") 然后,那么您实际上可以通过某种方式进行操作!

这样做之后,您还会发现需要在第18行添加更多括号,因为解析器会变得混乱。


另外,我推荐find库。它专门用于递归遍历目录。