按数字顺序对目录中的文件进行排序和列出

时间:2011-10-19 10:30:56

标签: ruby-on-rails ruby sorting natural-sort

这是我的文件夹结构。

/ home / files / encounter 9-22-11-0.jpg .. / home / files / encounter 9-22-11- [n] .jpg

puts Dir.glob("/home/files/*.jpg")[0] 

当我执行上面的代码时,它显示了第六个文件(索引5 => / home / files /遇到9-22-11-5.jpg),但实际上我需要输出作为第一个文件(索引0) => / home / files / encounter 9-22-11-0.jpg)

如何按用户定义的排序顺序对文件进行排序?像

当我尝试时..
.. [0] => / home / files / encounter 9-22-11-5.jpg
.. [1] => / home / files / encounter 9-22-11-21.jpg
。[2] => / home / files / encounter 9-22-11-39.jpg

但是,我需要 .. [0] => / home / files / encounter 9-22-11-0.jpg
.. [1] => / home / files / encounter 9-22-11-1.jpg
。[2] => / home / files / encounter 9-22-11-2.jpg

其他信息,排序也无效。

f = Dir.glob(“/ home / files / * .jpg”)。排序
f [0] => / home / files / encounter 9-22-11-0.jpg
f [0] => / home / files / encounter 9-22-11-1.jpg
f [0] => / home / files / encounter 9-22-11-10.jpg
f [0] => / home / files / encounter 9-22-11-11.jpg

2 个答案:

答案 0 :(得分:11)

puts Dir.glob("/home/files/*.jpg").sort

如果您的格式类似于11-09-22-05.jpg而不是9-22-11-5.jpg,则会有效。您可以尝试将它们排序为数字。

Dir.glob("/home/files/*.jpg").sort_by {|s| s.gsub("-","").to_i }

但是因为看起来你有月 - 日 - 年数字,我想正确的排序方式比这更复杂。

arr=%w[9-22-12-33.jpg 9-22-11-5.jpg 9-22-10-99.jpg 12-24-11-1.jpg]
arr.sort_by do |s|
  t = s.split("-").map(&:to_i)
  [t[2], t[0], t[1], t[3]]
end

它的工作原理是将9-22-11-5.jpg重新格式化为包含[11, 9, 22, 5]的数组,然后按其排序。

答案 1 :(得分:1)

如果可能的话,我会用固定宽度的数字格式创建文件:

encounters 9-22-11-05.jpg
encounters 9-22-11-11.jpg
encounters 9-22-11-99.jpg

如果这是不可能的,您可以提取最后一个数字部分并在自定义排序标准中使用它:

a = Dir.glob("*.jpg")
r = Regexp.new(".*-([0-9]+).jpg")
b = a.sort do |f1, f2|
  n1 = r.match(f1)[1].to_i
  n2 = r.match(f2)[1].to_i
  n1 <=> n2
end
puts b

这将从每个文件名中提取最后一个数字部分(使用正则表达式)并按此排序 如果您有属于不同日期的文件,则必须对其进行修改,以便按“基本”名称和数字部分进行排序。