下载大于一定大小的文件
Download the files that are bigger than a certain size
我有 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
returns
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
。
我的问题是如何通过一段 Bash
或 Perl
自动执行此操作。特别是我不知道如何提取 Content-Length
并进行比较...
有人能帮忙吗?
您可以使用 LWP
和 perl
并发送 HEAD
请求,获取响应 headers。像这样:
#!/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
您想要的文件。
为了适应各种 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 }')
printf "%s\n" "$SIZE"
.
我有 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
returns
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
。
我的问题是如何通过一段 Bash
或 Perl
自动执行此操作。特别是我不知道如何提取 Content-Length
并进行比较...
有人能帮忙吗?
您可以使用 LWP
和 perl
并发送 HEAD
请求,获取响应 headers。像这样:
#!/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
您想要的文件。
为了适应各种 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 }')
printf "%s\n" "$SIZE"
.