【问题标题】:How can I find just the PDF files under folders "Pricelist" and "Price List"?如何在“价格表”和“价格表”文件夹下找到 PDF 文件?
【发布时间】:2016-02-26 02:43:30
【问题描述】:

我的任务是在 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$/ 以实现我的目标?

【问题讨论】:

    标签: ruby regex file jruby glob


    【解决方案1】:

    使用递归全局

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

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

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

    可能有更有效的方法来做到这一点,或者如果它对您来说过于宽松,您可能需要调整正则表达式,但这肯定会解决问题,而无需了解您想要了解的目录树的根目录。搜索。

    【讨论】:

    • 我知道你的代码逻辑,但是不知道为什么我的程序没有输出。还是非常感谢!
    • @Leo 如果您仍然遇到问题(例如,得到[]),可能是因为:1)Workspace/Data/ 不在您当前的工作目录下。在这种情况下,请使用完全限定的路径,或者先将目录更改到搜索树的顶部;或 2) 您的 PDF 文件或目录名称是大小写混合的,在这种情况下,您需要将 glob 和正则表达式调整为不区分大小写。该解决方案在我的系统上使用 JRuby 9.0.5.0 进行测试,并按描述工作。很高兴它至少为您指明了正确的方向。
    【解决方案2】:

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

    【讨论】:

    • 对不起,我提供了错误的文件结构,我将编辑我的问题,你能帮我回答一下吗?谢谢!
    • 执行directory_list.append(path)行时出现“NoMethodError: undefined method append for []:Array”错误
    • 抱歉,我在 Python 和 Ruby 之间切换的次数太多了。在 Ruby 数组中 append 是 &lt;&lt; 运算符,而不是 append() 方法。
    • 还有,应该是'.pdf'
    猜你喜欢
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    相关资源
    最近更新 更多