我正在寻找一个可以找到没有扩展名的文件的代码。在 Rails 中,有一个文件app_name/doc/README_FOR_APP
. 我正在寻找一种方法来查找与此类似的文件,并且没有与文件关联的扩展名,即“gemfile”。就像是:
file = File.join(directory_path, "**", "__something__")
我正在寻找一个可以找到没有扩展名的文件的代码。在 Rails 中,有一个文件app_name/doc/README_FOR_APP
. 我正在寻找一种方法来查找与此类似的文件,并且没有与文件关联的扩展名,即“gemfile”。就像是:
file = File.join(directory_path, "**", "__something__")
由于您的问题没有明确指定是否要递归搜索没有扩展名的文件(尽管在评论中听起来像您可能),或者您是否要保留带前导点的文件(即 unix 中的隐藏文件),我包括每个场景的选项。
可见文件(非递归)
Dir['*'].reject { |file| file.include?('.') }
将返回一个包含所有不包含 '.' 的文件的数组。因此只有没有扩展名的文件。
隐藏文件(非递归)
Dir.new('.').entries.reject { |file| %w(. ..).include?(file) or file[1..-1].include?('.') }
这将查找当前目录中的所有文件,然后删除带有“。”的所有文件。在除第一个字符之外的任何字符中(即从索引 1 到结尾的任何字符,即索引 -1)。另请注意,因为Dir.new('.').entries
包含“。” 和 '..' 也被拒绝。
可见文件(递归)
require 'find'
Find.find('.').reject { |file| File.basename(file).include?('.') }.map { |file| file[2..-1] }
此地图末尾的地图只是通过删除前导'./'来与其他地图保持一致。如果您不在乎,可以将其删除。
隐藏文件(递归)
require 'find'
Find.find('.').reject { |file| File.basename(file)[1..-1].include?('.') }.map { |file| file[2..-1] }
注意:上面的每一个也将包括目录(有时也被认为是文件,至少在 unix 中)。要删除它们,只需添加.select { |file| File.file?(file) }
到上述任何一项的末尾。
Dir.glob(File.join(directory_path, "**", "*")).reject do |path|
File.directory?(path) || File.basename(path).include?('.')
end
更新:如果您想对“扩展名”进行更严格的定义,这里有一些更复杂的东西,它认为文件名具有扩展名当且仅当它只有一个点并且该点既不是第一个也不是最后一个字符名字:
Dir.glob(File.join(directory_path, "**", "*")).reject do |path|
name = File.basename(path)
File.directory?(path) || (name.count('.') == 1 && name[-1] != '.')
end
但是,我怀疑“没有点”更符合您的要求。
nonfile = File.join("**", "*.")
Dir.glob(nonfile).each do |path|
puts path
end
我在胡闹,我正在和一位同事交谈,我们想如果这样。这不是诀窍吗?