2013-02-28 60 views
0

我对Ruby很陌生,并且分支出过去的第一个脚本,询问我最喜欢的颜色是什么,然后重复给我。我正在做我认为是相对简单的任务,移动文件和更改名称。在Ruby中追加文件名?

我有一堆文件在子目录中,我需要移动到单个目录,然后追加所有这些文件的名称。具体需要保留原来的名称并添加到最后,IE AAB701.jpg - > AAB701_01.jpg。

我已经设法找到文件并移动它们(可能效率低下),但我没有追加到文件名。谷歌搜索,stackoverflow等,没有运气。

这是我现在的代码。

require 'find' 
require "fileutils" 

file_paths = [] 
Find.find('../../../Downloads') do |path| 
    file_paths << path if path =~ /.*\.jpg$/ 
end 

file_paths.each do |filename| 
    name = File.basename('filename') 
    dest_folder = "../../../Desktop/Testing/" 
    FileUtils.cp(filename, dest_folder) 
end 

file_paths.each do |fullname| 
append_txt = '_01' 
filename = "*.jpg" 
fullname = File.join(filename, append_txt) 

end 

实际的路径是非常不合理的,但我不熟悉不够用File.join或GSUB弄清楚什么是错的/最好的。

回答

0

首先我要提取一些工作,到一个小方法:

def new_name(fn, dest = '../../../Desktop/Testing/', append = '_01') 
    ext = File.extname(fn) 
    File.join(dest, File.basename(fn, ext) + append + ext) 
end 

然后我会申请更多的功能风格,你的目录遍历和处理:

Dir[ '../../../Downloads/**/*.jpg' ]. 
select { |fn| File.file? fn }. 
each { |fn| FileUtils.cp fn, new_name(fn) } 

而且,我不看看Find模块通过Dir#[]购买了什么,而dir glob让你免费过滤到jpgs。

+0

哇,这是如此的干净多了。我遇到了一个问题,因为它保留了文件扩展名,然后附加到它。 I.E. - AAB701.jpg-01.jpg – 2013-02-28 14:06:56

+0

@LukePatton对不起,我忘了['File :: basename'](http://ruby-doc.org/core-1.9.3/File.html#method-c-basename )的界面有点有趣。它需要第二个参数来描述剥离的扩展。我已经更新了答案。 – dbenhur 2013-02-28 15:52:05

+0

其实自己修复它。使用file.basename参数让它排除扩展名。 编辑:刚才看到你的补充,对不起。我已经把“.jpg”而不是分机,但分机似乎会适应脚本更好。 – 2013-02-28 16:35:28

0

我会修改您对FileUtils.cp的调用。

append_txt = '_01' 
file_paths.each do |filename| 
    name = File.basename('filename') 
    newname = name + append_txt # + File.extension() 
    dest_folder = "../../../Desktop/Testing/" 
    FileUtils.cp(filename, dest_folder + newname) 
end 

请注意,此代码对恶意文件名不安全;你应该搜索文件处理文档,以另一种方式来做到这一点。

0

一个简单的答案是文件:

require 'pathname' 

new_name =Pathname(orig_fn).sub_ext("01#{Pathname(orig_fn).extname}").to_s