在 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 获取特定文件或目录列表?