Bash 下载大于一定大小的文件

Bash 下载大于一定大小的文件,bash,perl,shell,web-scraping,web-crawler,Bash,Perl,Shell,Web Scraping,Web Crawler,我有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_Check

我有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。例如,卷头http://www.bcheadset.ca/fte.xlsx 返回

从内容长度,我们可以验证它是否大于10Mo

我的问题是如何通过Bash或Perl实现自动化。特别是我不知道如何提取内容长度并进行比较

有人能帮忙吗?

您可以使用LWP和perl发送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,而不是您想要的文件头

为了适应各种HTTP形式及其内容,某些类型的模式匹配可能是谨慎的。下面是如何在shell中使用全局匹配来完成此任务的一个粗略示例:

#!/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的简单方法:


.

这至少有两种情况:因为$BUFFER中的i需要进行路径名扩展,而Content Length:可能会作为另一个键的字段出现在头中的任何位置……此外:grep | awk通常不是一个好主意:awk'/^Content Length:/{print$2;exit;}将是更好的替代方法。顺便说一下,冒号后面的空格是可选的,所以$2可能有效,也可能无效。。。
#!/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"
SIZE=$(curl --head http://www.bcheadset.ca/fte.xlsx | grep 'Content-Length:' | awk '{print $2}')

printf "%s\n" "$SIZE"