2011-10-19 79 views
1

这是我的文件夹结构。按数字顺序排序并列出目录中的文件

/家/文件/相遇9-22-11-0.jpg .. /家/文件/遭遇9-22-11- [n]的.jpg文件

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

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

如何将文件按用户定义的排序顺序排序?像

当我试图..
.. [0] =>/home/files/encounters 9-22-11-5.jpg
.. [1] =>/home/files/encounters 9-22-11-21.jpg
.. [2] =>/home/files/encounters 9-22-11-39.jpg

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

其他信息,排序也不起作用。

F = Dir.glob( “/家/文件/ *。JPG”)。排序
F [0] => /家庭/文件/遭遇9-22-11-0.jpg
F [ 0] =>/home/files/encounters 9-22-11-1.jpg
f [0] =>/home/files/encounters 9-22-11-10.jpg
f [0] => /家庭/文件/交锋9-22-11-11.jpg

回答

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

这不会帮助OP,因为他希望-2.jpg之前-11.jpg –

+2

为什么要将它格式化为字符串?按数组排序会具有相同的语义:'arr。sort_by do | s | t = ...; [t [2],t [0],t [1],t [3]];结束' – qerub

+0

@ Qerub谢谢,我完全忘了你可以做到这一点。 –

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 

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

+0

谢谢@弗兰克施密特。它为我工作。你能告诉我“n1 <=> n2”吗? –

+0

这是太空船的操作员。 http://stackoverflow.com/questions/827649/ruby-spaceship-operator –

+0

请注意,此解决方案只能在最后一个数字上排序。在此之前,它不会注意到推测的日期。 –

相关问题