2011-10-19 80 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

請注意,此解決方案只能在最後一個數字上排序。在此之前,它不會注意到推測的日期。 –

相關問題