Ruby 如何在没有扩展名的目录中查找文件?

Ruby 如何在没有扩展名的目录中查找文件?,ruby,Ruby,我正在寻找一个代码,将找到没有扩展名的文件。在Rails中,有一个文件app\u name/doc/README\u用于app。我正在寻找一种方法来查找与此类似的文件,并且没有与该文件相关联的扩展名,即“gemfile”。比如: file = File.join(directory_path, "**", "__something__") 由于您的问题没有明确指定是否要递归搜索不带扩展名的文件(尽管在注释中听起来可能是这样),或者是否要保留带前导点的文件(即unix中的隐藏文件),因此我为每个

我正在寻找一个代码,将找到没有扩展名的文件。在Rails中,有一个文件
app\u name/doc/README\u用于app
。我正在寻找一种方法来查找与此类似的文件,并且没有与该文件相关联的扩展名,即“gemfile”。比如:

file = File.join(directory_path, "**", "__something__")

由于您的问题没有明确指定是否要递归搜索不带扩展名的文件(尽管在注释中听起来可能是这样),或者是否要保留带前导点的文件(即unix中的隐藏文件),因此我为每个场景提供了选项

可见文件(非递归)

将返回不包含“.”的所有文件的数组,因此只返回没有扩展名的文件

隐藏文件(非递归)

这将查找当前目录中的所有文件,然后删除除第一个字符(即从索引1到结尾的任何字符,也称为索引-1)之外的任何字符中带有“.”的文件。还请注意,由于
Dir.new('.')。条目
包含'.'和'.'',因此这些条目也会被拒绝

可见文件(递归)

此图末尾的地图只是通过删除前导“/”来保持与其他地图的一致性。如果你不在乎,你可以把它移除

隐藏文件(递归)

注意:上面的每一个都将包括目录(至少在unix中有时也被视为文件)。要删除它们,只需添加
。选择{| 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
我在胡闹,我在和一个同事说话,我们想如果这是真的。
这难道不管用吗

您将什么定义为扩展?.txt、.rb。css诸如此类的文件,比如gemfile rakefile README_FOR_APP等等,没有扩展名。我正在编写一个脚本,该脚本在文件中运行并对其进行注释。所以我正在寻找一种方法来查看所有没有扩展名的文件并编写一些东西。这在技术上是不正确的。在像
.htaccess
simple.example.noextension
这样的文件中,没有扩展名,并且它仍然是一个有效的文件名..htaccess实际上是一个扩展名。@EricMathison,一点也不。这是一个隐藏的文件。在Unix系统中,以至少一个点为前缀的文件或文件夹是隐藏的。@Jueecy.new您当然是正确的,但我认为这个答案对“扩展”的解释更为宽松,它听起来像Tony的目标。
Dir.glob(File.join(directory|path,***,“*”)。拒绝{path | path.split(“/”)。last.include?(“)}
看起来它比Erics更深入。有没有办法排除数组中的目录?@TonyLombardi当然,只需将
File.directory?(path)
添加到拒绝标准中即可。我更新了更复杂的示例,但是如果实际文件只需要“没有点”,您就可以对第一个示例执行完全相同的操作。@TonyLombardi实际上我想我也应该更新第一个示例,所以我就这么做了。@DarshanComputing我希望您不介意,我编辑了您的答案以使用file.basename(path)而不是path.split(File::SEPARATOR),因为它看起来有点短而且更具表现力。如果我没有弄错的话,
Dir.glob('***.)
(这基本上就是您在这里所做的)递归地搜索以
结尾的文件。
。例如
'foobar.
。我认为这不是你想要的。在我的回答中,我又添加了一些解决方案,这些解决方案可能会进一步帮助您。
require 'find'
Find.find('.').reject { |file| File.basename(file)[1..-1].include?('.') }.map { |file| file[2..-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
nonfile = File.join("**", "*.")
Dir.glob(nonfile).each do |path|
    puts path
end