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

Mr.*_*ack 4 ruby sorting ruby-on-rails 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] 
Run Code Online (Sandbox Code Playgroud)

当我执行上面的代码时,它显示第六个文件(索引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 /遇到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

Jon*_*röm 12

puts Dir.glob("/home/files/*.jpg").sort
Run Code Online (Sandbox Code Playgroud)

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

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

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

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
Run Code Online (Sandbox Code Playgroud)

它通过重新格式化9-22-11-5.jpg为包含[11, 9, 22, 5]然后按其排序的数组来工作.

  • 为什么要将其格式化为字符串?按数组排序将具有相同的语义:`arr.sort_by do | s | t = ......; [t [2],t [0],t [1],t [3]]; end` (2认同)