2010-03-31 50 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