如何在“价目表”和“价目表”文件夹下找到PDF文件?

时间:2016-02-26 02:43:31

标签: ruby regex file jruby glob

我的任务是在Windows 7上使用JRuby找出几个价目表文件夹下的所有PDF文件。文件夹结构如下:

WorkSpace/Data/2015/city1/A/...
WorkSpace/Data/2015/city1/B/...
WorkSpace/Data/2015/city1/Pricelist/...
WorkSpace/Data/2015/city1/...
WorkSpace/Data/2015/city1/Price List/.....
WorkSpace/Data/2015/city2/A/...
WorkSpace/Data/2015/city2/C/...
WorkSpace/Data/2015/city2/Pricelist/...
WorkSpace/Data/2015/city2/D/...
WorkSpace/Data/2015/city2/Price List/.....

WorkSpace/Data/2016/city1/folder1/...
WorkSpace/Data/2016/city1/folder2/...
WorkSpace/Data/2016/city1/Pricelist/...
WorkSpace/Data/2016/city1/folder3/...
WorkSpace/Data/2016/city1/folder4/Price List/...
WorkSpace/Data/2016/city2/folder1/...
WorkSpace/Data/2016/city2/folder2/...
WorkSpace/Data/2016/city2/Pricelist/...
WorkSpace/Data/2016/city2/folder3/...
WorkSpace/Data/2016/city2/folder4/Price List/...

...表示其相应文件夹下的所有类型的文件。

我只想在文件夹PricelistPrice List下找到PDF文件。我怎么能这样做?

我读了Searching a folder and all of its subfolders for files of a certain type。这是一个我认为有用的答案,但是如何修改表达式/.*\.pdf$/以实现我的目标呢?

2 个答案:

答案 0 :(得分:2)

使用递归Glob

您需要找到的文件只有Dir#globEnumerable#grep。例如:

Dir.glob('WorkSpace/Data/**/*.pdf').grep /Price List|Pricelist/

这将使用递归的glob模式收集所有PDF文件,该模式从Workspace/Data开始下降到所有子目录(根据需要调整此起始目录的路径),然后仅返回与您的目录匹配的结果#39;重新打算。在这种情况下,我们使用正则表达式模式进行交替查找您正在寻找的两个目录中的任何一个,而不考虑所需目录的嵌套程度。

可能有更有效的方法来执行此操作,或者您可能需要调整正则表达式,如果它对您来说过于宽松,但这肯定解决了问题,而无需了解更多目录的根目录你要搜索的树。

答案 1 :(得分:1)

您可能希望查看Find module。代码将是这样的:

results = []
directory_list = []

Find.find('Workspace/Data') do |path|
    if FileTest.directory?(path)
        fn = File.basename(path)
        if fn == 'Pricelist' || fn == 'Price List'
            directory_list << path
            Find.prune
        end
    end
end

directory_list.each do |starting_path|
    Find.find(starting_path) do |path|
        if File.extname(path) == '.pdf'
            results << path
        end
    end
end

第一个循环扫描并找到与目录名称条件匹配的所有目录,跳过它们下面的扫描,因为这将在第二个循环中发生。第二个循环获取第一个循环找到的每个目录,并扫描它们以“.pdf”扩展名结尾的文件,将每个目录添加到结果列表中。

您可以将第二个循环的主体向上提升到第一个循环中代替directory_list << path,但生成的代码将难以阅读,并且不会获得任何性能提升。