2014-11-02 82 views
1

我有这样的代码,不会在当前目录下的图像的一些重命名:红宝石重命名文件删除文件

puts Dir["**/*"].length 

folder_path = Dir.pwd 

filenames = Dir.glob("*.png") 

filenames.each_with_index do |filename, index| 
    File.rename(filename, folder_path + "/#{index}" + File.extname(filename)) 
end 

我的控制台:

98 
$ ruby rename.rb 
90 
$ ruby rename.rb 
90 
$ ruby rename.rb 
90 
$ ruby rename.rb 
82 
$ ruby rename.rb 
82 
$ ruby rename.rb 
74 
$ ruby rename.rb 
74 
$ ruby rename.rb 
66 

好像这是第3时间我跑代码中的一些图像在进程中被删除。

+0

无关,但'#{index.to_s}'是多余的。使用'#{}'已经调用'to_s',所以你实际上在做'index.to_s.to_s'。只需使用'#{index}'。 – meagar 2014-11-02 18:00:21

+0

@meagar已更新。如果我更新脚本,每运行一次新的文件名示例“/ sa#{index}”,则不会删除这些文件。 – 2014-11-02 18:03:05

+0

“这似乎是我第三次运行代码时,某些图像在进程中被删除。” - 他们是否被删除?你说它看起来像。我可以一遍又一遍地运行这段代码,它所做的只是将它命名为PNG的0.png,1.png,2.png等。似乎很好。 – 2014-11-02 18:09:59

回答

1

脚本可以删除文件,是清除现有的文件具有相同名称的唯一途径...您可以检查文件是否已经存在这样的:

puts Dir["**/*"].length 

folder_path = Dir.pwd 

filenames = Dir.glob("*.png") 

filenames.each_with_index do |filename, index| 
    new_name= folder_path + "/#{index}" + File.extname(filename) 
    raise "#{new_name} already exists" if File.exists?(new_name) 
    File.rename(filename, new_name) 
end 
0

,如果你可以做这样的事情即使存在名称的文件,也要重命名该文件:

folder_path = Dir.pwd 
filenames = Dir.glob('*.png') 

filenames.each_with_index do |filename, index| 
    new_name = folder_path + "/#{index}" + File.extname(filename) 
    unless File.exists?(new_name) 
     File.rename(filename, new_name) 
    else 
     index += 1 
     new_name = folder_path + "/#{index}" + File.extname(filename) 
     File.rename(filename, new_name) 
    end 
end 
+0

由于在第二次重命名之前没有检查,此脚本仍然可以覆盖文件。 – ThomasSevestre 2014-11-02 22:28:52