在Ruby中附加文件名?

时间:2013-02-28 06:27:57

标签: ruby append filenames

我对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不够熟悉,无法弄清楚什么是错误的/最好的。

3 个答案:

答案 0 :(得分: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

请注意,此代码对恶意文件名不安全;你应该搜索文件处理文档以获得另一种方法。

答案 1 :(得分: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。

答案 2 :(得分:0)

一个更简单的答案是文件:

require 'pathname'

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