2010-03-31 112 views
2

我目前正在研究一個紅寶石項目,並且在我應該如何進行時遇到了一堵牆。在項目中,我使用Dir.glob來搜索目錄及其所有子目錄中的某些文件類型,並將它們放入數組中。我正在使用的文件類型都具有相同的文件名,並通過擴展名進行區分。例如,高級數組在Ruby中排序

txt_files = Dir.glob("**/*.txt") 
doc_files = Dir.glob("**/*.doc") 
rtf_files = Dir.glob("**/*.rtf") 

將返回類似的東西,

FILECON.txt ASSORTED.txt FIRST.txt

FILECON.doc ASSORTED.doc FIRST.doc

FILECON.rtf ASSORTED.rtf FIRST.rtf

因此,我的問題是如何有效地分解這些數組(處理數千個文件)並將具有相同文件名的所有文件放入數組中。新的陣列會是什麼樣子,

FILECON.txt FILECON.doc FILECON.rtf

ASSORTED.txt ASSORTED.doc ASSORTED.rtf

等等,等等

我我甚至不確定glob是否是正確的方法(所有具有相同文件名的文件都在同一個文件夾中)。任何幫助將不勝感激!

回答

0

不知道這是否是你所需要的東西,但你可以嘗試

# first get all files 
all_files = Dir.glob('**/*') 
# then you can group them by name 
by_name = all_files.group_by{|f| m = f.match(/([^\/]+)\.[^.\/]+$/); m[1] if m} 
# and by extension 
by_ext = all_files.group_by{|f| m = f.match(/[^\/]+\.([^.\/]+)$/); m[1] if m} 

BTW,我沒有看到這個問題的任何關係與排序。

+0

對不起,也許我沒有使用正確的術語來做我想做的事情(還是新的Ruby)。我想要做的是採取我擁有的三個glob數組,並製作另外三個數組。新數組將包含具有相同名稱但擴展名不同的文件名。我沒有使用全局搜索(Dir.glob('**/*'))的原因是我不想將其他文件與其他文件混合在一起進行分類。 – 2010-03-31 20:15:48

+1

所以你可以1)執行與上面'by_name'相同的邏輯,在你已經擁有的三個數組的每一個上,或者2)而不是通過'Dir.glob('**/*')獲取所有文件。 ',只需要帶有你需要的擴展名:'Dir.glob(「**/*。{txt,doc,rtf}」)',就像Glenn所說的那樣。 – 2010-03-31 20:44:21

6

您的所有文件到一個單一的陣列Dir.glob("**/*.{txt,doc,rtf}")

不要忘了,所有的文件名有太多的目錄,所以如果你想通過基名進行排序,然後

files = Dir.glob("**/*.{txt,doc,rtf}").sort_by {|f| File.basename f} 
+0

謝謝,這正是我想要完成的! – 2010-04-01 13:34:23