以ruby方式递归扫描特定文件夹中的文件

时间:2014-03-28 10:01:41

标签: ruby recursion directory

我尝试递归扫描特定文件夹并搜索特定文件。

在根文件夹(例如,C:\ Users \ Me)中,我想只扫描名为my *的文件夹(所以,以字母开头的文件夹' my' +等等) ,然后查看是否有文件.txt并将第一行存储在变量中。

对于扫描,我尝试使用此代码,但没有成功

require 'find'

pdf_file_paths = []
path_to_search = ['C:\Users\Me'];

Find.find('path_to_search') do |path|
    if path =~ /.*\.txt$/
        #OPEN FILE
end

3 个答案:

答案 0 :(得分:1)

这应该做的工作:

lines = Dir.glob("#{path}/**/my*/*.txt").map do |filename|
  File.open(filename) do |f|
    f.gets
  end
end

Dir.glob类似于* nix机器上的glob可执行文件。这也适用于Windows。 gets获得第一行。确保您使用forward slash even for a Windows machine

答案 1 :(得分:1)

我做如下:

first_lines_of_each_file = []
Dir.glob("C:/Users/Me/**/my**/*.txt",File::FNM_CASEFOLD) do |filepath|
  File.open(filepath,'rb') { |file| first_lines_of_each_file << file.gets }
end

File::FNM_CASEFOLD常量将使用不区分大小写搜索搜索所有目录和文件。但是如果你想要区分大小写的搜索,那么就不需要使用第二个参数File::FNM_CASEFOLD

如果您将目录组织为

C:/Users/Me/
|- my_dir1/
    |- a.txt
    |- my_dir2/
        |- foo.txt
        |- baz.doc
|- my_dir3/
    |- biz.txt
  • Dir.glob("C:/Users/Me/**/my**/*.txt"将为您提供所有.txt文件。由于搜索是递归的。

  • Dir.glob("C:/Users/Me/my**/*.txt"只会为您提供位于目录中的.txt文件,这些文件是C:/Users/Me/的直接子项。您将获得的唯一文件是a.txtbiz.txt

答案 2 :(得分:0)

我不确定这是否是最干净的解决方案,但您可以尝试:

def find_files(file_name, root_path, folder_pattern = nil)
  root_path = File.join(root_path, '')
  paths = Dir[File.join(root_path, '**', file_name)]
  paths.keep_if! {|p| p.slice(path.size, p.size).split('/').all? {|s| s =~ folder_pattern}} if folder_pattern
end

find_files('C:/Users/Me', 'find_me.txt', /my.*/)