我正在寻找一个可以找到没有扩展名的文件的代码。在Rails中,有一个文件app_name/doc/README_FOR_APP
。我正在寻找一种方法来查找与此类似的文件,没有与文件关联的扩展名,即' gemfile'。类似的东西:
file = File.join(directory_path, "**", "__something__")
答案 0 :(得分:4)
由于您的问题没有明确指定是否要以递归方式搜索没有扩展名的文件(尽管在评论中听起来像你可能),或者您是否希望保留带有前导点的文件(即隐藏文件) unix),我为每个场景都包含了选项。
可见文件(非递归)
Dir['*'].reject { |file| file.include?('.') }
将返回所有不包含'。'的文件的数组。因此只有没有扩展名的文件。
隐藏文件(非递归)
Dir.new('.').entries.reject { |file| %w(. ..).include?(file) or file[1..-1].include?('.') }
这会找到当前目录中的所有文件,然后删除带有“。”的所有文件。在除第一个之外的任何字符中(即从索引1到结尾的任何字符,a.k.a index -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) }
添加到上述任何一个的末尾。
答案 1 :(得分:1)
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
我怀疑“没有点”是你想要的更多。
答案 2 :(得分:0)
nonfile = File.join("**", "*.")
Dir.glob(nonfile).each do |path|
puts path
end
我在乱搞,我正和一位同事谈话,我们想到了这一点。 这不是诀窍吗?