在 Ruby 中,如何在目录列表中的文件夹之前列出/排序文件?

Posted

技术标签:

【中文标题】在 Ruby 中,如何在目录列表中的文件夹之前列出/排序文件?【英文标题】:In Ruby, how do you list/sort files before folders in a directory listing? 【发布时间】:2010-10-09 00:19:47 【问题描述】:

我必须遵循 ruby​​ 中的代码:

<%
  files = Dir.glob('/**/*')
  files.each do |file|
    puts file
  end
%>

它输出(例如):

/dirA/file1.txt
/dirA/file2.txt
/dirB/file1.txt
/file1.txt
/file2.txt
/subdirA/file1.txt

我希望它像这样输出:

/file1.txt
/file2.txt
/dirA/file1.txt
/dirA/file2.txt
/dirB/file1.txt
/subdirA/file1.txt

基本上,我希望将文件显示在目录之前。有没有我可以使用的排序命令?

【问题讨论】:

【参考方案1】:

我相信这对你有用:

files = Dir.glob('**/*')
files = files.map  |file| [file.count("/"), file] 
files = files.sort.map  |file| file[1] 
files.each do |file|
  puts file
end

如果您使用的是 Ruby 1.8,请将 "/" 更改为 ?/

或者,作为一个单行::)

Dir.glob('**/*').map  |file| [file.count("/"), file] .sort.map  |file| file[1] .each  |file| puts file 

【讨论】:

Enumerable#sort_by 使 Schwartzian 变换更易于遵循,String#count 适用于 1.8 和 1.9:files = Dir.glob('**/*').sort_by |file| [file.count("/"), file]。 (仍然需要该数组来打破具有相同斜线计数的文件名之间的联系。) 我不明白为什么需要sort_by;数组排序标准应该没问题,不是吗? (比较第一个元素,如果相同,则移至下一个元素。)我不想将计数放在比较块内,因为那样效率低下(我认为 Ruby 不够聪明,无法自己记忆)。我不知道String#count;感谢那。使用它肯定会更优雅。我会编辑它。【参考方案2】:
d,f = Dir.glob('*').partition|d|test(?d,d)
d.sort.each|x|puts x
f.sort.each|y|puts y

【讨论】:

以上是关于在 Ruby 中,如何在目录列表中的文件夹之前列出/排序文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用 os.walk 获取特定文件或目录列表?

在 Ruby 中递归列出目录的单线器?

如何列出 Python 模块中的所有函数?

如何列出 Python 模块中的所有函数?

在 C# 中列出文件夹内的重复文件:利用 LINQ.AsParallel

如何使用 Cyrillic 字体列出文件夹的内容?