使用Ruby获取文件夹中所有文件的名称

我想使用Ruby获取文件夹中的所有文件名。

你也有快捷选项

Dir["/path/to/search/*"] 

如果你想find任何文件夹或子文件夹中的所有Ruby文件:

 Dir["/path/to/search/**/*.rb"] 
 Dir.entries(folder) 

例:

 Dir.entries(".") 

资料来源: http : //ruby-doc.org/core/classes/Dir.html#method-c-entries

以下代码片段精确地显示了目录内文件的名称,跳过子目录和"."".."虚线文件夹:

 Dir.entries("your/folder").select {|f| !File.directory? f} 

要recursion获取所有文件(仅限于文件):

 Dir.glob('path/**/*').select{ |e| File.file? e } 

或者任何不是目录( File.file?会拒绝非常规文件):

 Dir.glob('path/**/*').reject{ |e| File.directory? e } 

替代scheme

使用Find#find查找类似Dir.glob的基于模式的查找方法实际上更好。 看到这个答案“在Ruby单recursion列表目录?” 。

就个人而言,我发现这是最有用的循环在文件夹中的文件,前瞻性的安全性:

 Dir['/etc/path/*'].each do |file_name| next if File.directory? file_name end 

这适用于我:

如果你不想隐藏文件[1],使用Dir []

 # With a relative path, Dir[] will return relative paths # as `[ './myfile', ... ]` # Dir[ './*' ].select{ |f| File.file? f } # Want just the filename? # as: [ 'myfile', ... ] # Dir[ '../*' ].select{ |f| File.file? f }.map{ |f| File.basename f } # Turn them into absolute paths? # [ '/path/to/myfile', ... ] # Dir[ '../*' ].select{ |f| File.file? f }.map{ |f| File.absolute_path f } # With an absolute path, Dir[] will return absolute paths: # as: [ '/home/../home/test/myfile', ... ] # Dir[ '/home/../home/test/*' ].select{ |f| File.file? f } # Need the paths to be canonical? # as: [ '/home/test/myfile', ... ] # Dir[ '/home/../home/test/*' ].select{ |f| File.file? f }.map{ |f| File.expand_path f } 

现在, Dir.entries将返回隐藏的文件,并且不需要通配符asterix(只需传递带有目录名称的variables),但是它将直接返回基本名称,所以File.xxx函数将不起作用。

 # In the current working dir: # Dir.entries( '.' ).select{ |f| File.file? f } # In another directory, relative or otherwise, you need to transform the path # so it is either absolute, or relative to the current working dir to call File.xxx functions: # home = "/home/test" Dir.entries( home ).select{ |f| File.file? File.join( home, f ) } 

[1] .dotfile上的.dotfile ,我不知道Windows

这是在目录中查找文件的解决scheme:

 files = Dir["/work/myfolder/**/*.txt"] files.each do |file_name| if !File.directory? file_name puts file_name File.open(file_name) do |file| file.each_line do |line| if line =~ /banco1/ puts "Found: #{line}" end end end end end 

在获取目录中的所有文件名时,可以使用此片段来拒绝两个目录[ ... ]和以a开头的隐藏文件.

 files = Dir.entries("your/folder").reject {|f| File.directory?(f) || f[0].include?('.')} 
 def get_path_content(dir) queue = Queue.new result = [] queue << dir until queue.empty? current = queue.pop Dir.entries(current).each { |file| full_name = File.join(current, file) if not (File.directory? full_name) result << full_name elsif file != '.' and file != '..' queue << full_name end } end result end 

从目录和所有子目录返回文件的相对path

如果你想得到一个包括符号链接的文件名数组,使用

 Dir.new('/path/to/dir').entries.reject { |f| File.directory? f } 

甚至

 Dir.new('/path/to/dir').reject { |f| File.directory? f } 

如果你想没有符号链接 ,使用

 Dir.new('/path/to/dir').select { |f| File.file? f } 

如其他答案中所示,如果要recursion获取所有文件,请使用Dir.glob('/path/to/dir/**/*')而不是Dir.new('/path/to/dir')

 Dir.new('/home/user/foldername').each { |file| puts file } 

这对我有用:

 Dir.entries(dir).select { |f| File.file?(File.join(dir, f)) } 

Dir.entries返回一个string数组。 那么,我们必须提供文件的完整path到File.file? ,除非dir等于我们当前的工作目录。 这就是为什么这个File.join()

你也可以使用Rake::FileList (假设你有rake依赖):

 FileList.new('lib/*') do |file| p file end 

根据API:

FileLists是懒惰的。 当为文件列表中包含的可能文件给出一个glob模式列表时,FileList不会search文件结构以查找文件,而是保存用于后面使用的模式。

https://docs.ruby-lang.org/en/2.1.0/Rake/FileList.html