0

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

4

3 回答 3

1

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

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。

于 2013-02-28T07:17:59.657 回答
1

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

require 'pathname'

new_name =Pathname(orig_fn).sub_ext("01#{Pathname(orig_fn).extname}").to_s
于 2014-05-10T16:40:51.187 回答
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

请注意,此代码对恶意文件名并不安全;您应该在文件处理文档中搜索另一种方法来执行此操作。

于 2013-02-28T06:34:26.707 回答