1

我想制作一个 Ruby 程序,将当前目录中的图像分类到不同的子文件夹中,例如:

tree001.jpg, ... tree131.jpg -> to folder "tree"
apple01, ... apple20.jpg -> to folder "apple"
plum1.jpg, plum2.jpg, ... plum33.jpg -> to folder "plum"

依此类推,程序应该通过它们的名称自动识别哪些文件属于一起。我不知道如何实现这一目标。到目前为止,我制作了一个小程序,它使用命令“Dir”将文件收集到一个数组中,并按字母顺序对其进行排序,以帮助通过文件名找到适当的类。有人有好主意吗?

4

3 回答 3

0

假设每个文件名都以非数字字符开头,后跟至少一个数字字符,并且最初的非数字字符定义了您希望文件移动到的目录:

require 'fileutils'

Dir.glob("*").select{|f| File.file? f}.each do |file| # For each regular file
  dir = file.match(/[^\d]*/).to_s              # Determine destination directory
  FileUtils.mkdir_p(dir)                       # Make directory if necessary
  FileUtils.mv(file, dir)                      # Move file
end

如有必要,将创建目录。添加文件后,您可以再次运行它。例如,如果您tree1.txt稍后添加文件并重新运行它,它将被移动到已经存在的位置tree/tree001.jpgtree131.jpg

更新:在评论中,您添加了一个要求,即您只想对组成至少 10 个组的文件执行此操作。这是一种方法:

require 'fileutils'

MIN_GROUP_SIZE = 10

reg_files = Dir.glob("*").select{|f| File.file? f}
reg_files.group_by{|f| f.match(/[^\d]*/).to_s}.each do |dir, files|
  next if files.size < MIN_GROUP_SIZE

  FileUtils.mkdir_p(dir)

  files.each do |file|
    FileUtils.mv(file, dir)
  end
end
于 2013-06-27T23:31:57.183 回答
0

我会这样做:

files = %w[
  tree001.jpg tree03.jpg tree9.jpg
  apple1.jpg apple002.jpg
  plum3.jpg plum300.jpg
].shuffle
# => ["tree001.jpg", "apple1.jpg", "tree9.jpg", "plum300.jpg", "apple002.jpg", "plum3.jpg", "tree03.jpg"]

grouped_files = files.group_by{ |fn| fn[/^[a-z]+/i] }
# => {"tree"=>["tree001.jpg", "tree9.jpg", "tree03.jpg"], "apple"=>["apple1.jpg", "apple002.jpg"], "plum"=>["plum300.jpg", "plum3.jpg"]}

grouped_files.each do |grp, files|
  Dir.mkdir(grp) unless Dir.exist(grp)
  files.each { |f| FileUtils.mv(f, "#{grp}/#{f}") }
end

我无法对此进行测试,因为我没有所有文件,也不愿意生成它们。

重要的是group_by。它使对类似名称的文件进行分组变得容易,从而使遍历它们变得容易。

对于您的情况,您需要将分配替换为filesDir.glob(...)获取Dir.entries(...)您的文件列表。

如果要将文件路径与文件名分开,请查看File.splitorFile.dirnameFile.basename

File.split('/path/to/foo')
=> ["/path/to", "foo"]
File.dirname('/path/to/foo')
=> "/path/to"
File.basename('/path/to/foo')
=> "foo"
于 2013-06-27T23:32:41.033 回答
0

查看查找:

http://www.ruby-doc.org/stdlib-2.0/libdoc/find/rdoc/Find.html

或 Dir.glob:

http://ruby-doc.org/core-2.0/Dir.html#method-c-glob

例如:

Dir.glob("*.jpg")

将返回一个可以迭代的数组each

于 2013-06-27T22:52:17.863 回答