我尝试递归扫描特定文件夹并搜索特定文件。
在根文件夹(例如,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
答案 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.txt
,biz.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.*/)