使用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文件结构以查找文件,而是保存用于后面使用的模式。