这是我的文件夹结构。
/ 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
答案 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
这将从每个文件名中提取最后一个数字部分(使用正则表达式)并按此排序 如果您有属于不同日期的文件,则必须对其进行修改,以便按“基本”名称和数字部分进行排序。