这是我的基本脚本,用于重命名从给定目录开始的文件文件树:
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"在实际重命名文件的语句上的修饰符,当前目录中的所有文件都被重命名但不在其他任何地方,因为我没有挖掘到其他目录,并且还告诉我代码是有用的。如何解决这个错误?
答案 0 :(得分:0)
块开头的简单p f
显示问题。 Dir.glob
扩展文件全局,但您只传递Dir.pwd
(没有全局)。所以你的cwd被传递给重命名,它肯定是一个目录,所以它立即传递给自己再次重命名,提示无休止的递归和堆栈错误。
如果您将其更改为Dir.glob("#{dir}" + "/*")
然后,那么您实际上可以通过某种方式进行操作!
这样做之后,您还会发现需要在第18行添加更多括号,因为解析器会变得混乱。
另外,我推荐find库。它专门用于递归遍历目录。