代码之家  ›  专栏  ›  技术社区  ›  Leo

我如何才能在“Pricelist”和“Price List”文件夹下找到PDF文件?

  •  0
  • Leo  · 技术社区  · 8 年前

    我有一个任务,在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/...
    

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

    我只想在文件夹下找到PDF文件 Pricelist Price List 。我该怎么做?

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

    2 回复  |  直到 7 年前
        1
  •  2
  •   Todd A. Jacobs    8 年前

    使用递归球

    你只需要找到你的文件 Dir#glob Enumerable#grep 。例如:

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

    这将使用递归glob模式收集所有PDF文件,该模式从 Workspace/Data (根据需要调整此起始目录的路径),然后只返回与您要搜索的目录匹配的结果。在本例中,我们使用了一个交替的正则表达式模式来查找您要查找的两个目录中的任何一个,而不考虑所需目录的嵌套深度。

    可能有更有效的方法来做到这一点,或者如果正则表达式对您来说太过宽松,您可能需要调整它,但这当然可以解决问题,而不需要知道您要搜索的目录树的根目录。

        2
  •  1
  •   Todd Knarr    8 年前

    你可能想看看 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 ,但生成的代码将更难阅读,并且不会获得任何性能改进。