【问题标题】:Download the files that are bigger than a certain size下载大于一定大小的文件
【发布时间】:2015-10-06 15:31:30
【问题描述】:

我有Files.txt,其中包含 Excel 文件的 URL 列表:

http://www.bcheadset.ca/applicant.xlsx
http://www.bcheadset.ca/fte.xlsx
http://www.iutox.org/TRTF_Matrix2012_Oct.xlsx
http://www.journalprices.com/2013_FinalSummaryForWeb.xlsx
http://www.camts.org/7__2013_Aircraft_Checklist.xlsx
http://www.nanotr11.org/poster_program.xlsx
http://www.vliruos.be/media/6352100/nss2015_annex_3_budget.xlsx
...

我想做的是(通过 wget)下载大于10Mo 的文件。

要在下载文件之前验证文件是否大于10Mo,我们可以使用curl --head。例如,curl --head http://www.bcheadset.ca/fte.xlsx 返回

HTTP/1.1 200 OK
Content-Length: 3158847
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Last-Modified: Mon, 27 Jul 2015 22:16:45 GMT
Accept-Ranges: bytes
ETag: "ffb49fecb9c8d01:c05"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Tue, 06 Oct 2015 15:14:27 GMT

而从Content-Length,我们可以验证它大于10Mo

我的问题是如何通过BashPerl 自动执行此操作。特别是我不知道如何提取Content-Length并进行比较...

有人可以帮忙吗?

【问题讨论】:

    标签: bash perl shell web-scraping web-crawler


    【解决方案1】:

    您可以使用LWPperl 并发送HEAD 请求,获取响应标头。像这样的:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    
    use LWP;
    use Data::Dumper;
    
    my $request = HTTP::Request -> new ( HEAD => 'http://www.google.com' ); 
    my $agent = LWP::UserAgent -> new;
    my $response = $agent -> request ( $request );
    print $response -> header ( 'Content-Length'); 
    

    然后使用 LWP 执行 GET 而不是 HEAD 你想要那个文件。

    【讨论】:

      【解决方案2】:

      为了适应各种 HTTP 表单及其内容,某种类型的模式匹配可能是谨慎的。下面是一个粗略的例子,说明如何在 shell 中使用 glob 匹配来完成此操作:

      #!/bin/sh
      
      
      BUFFER=$(curl --head http://www.bcheadset.ca/fte.xlsx )
      
      HOLD=""
      
      TAKENEXT=0
      
      
      for i in $BUFFER
      do case "$i" in
             Content-Length:)
             TAKENEXT=1
             ;;
          *) if [ "$TAKENEXT" -eq 1 ]
             then HOLD="$i"
                  break
             fi
             ;;
          esac
      done
      
      printf "SIZE was:  %s\n" "$HOLD"
      

      这是一个使用grep的更简单的方法:

      SIZE=$(curl --head http://www.bcheadset.ca/fte.xlsx | grep 'Content-Length:' | awk '{print $2}')
      
      printf "%s\n" "$SIZE"
      

      .

      【讨论】:

      • 这至少在两个方面被破坏:for i in $BUFFER 受路径名扩展,Content-Lenght: 可能出现在标题中的任何位置(作为另一个键的字段)...
      • 另外:grep | awk 通常是个坏主意:awk '/^Content-Length:/{print $2;exit;}' 会是更好的替代品。顺便说一句,冒号后面的空格是可选的,所以$2 可能有效也可能无效...
      猜你喜欢
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多