2015-10-06 47 views
2

我有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並做比較...

任何人都可以幫忙嗎?

回答

3

您可以使用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你想要的文件。

1

爲了適應各種HTTP表單及其內容,某些類型的模式匹配可能比較謹慎。下面是如何使用的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" 

+0

這在至少兩種方式中被破壞:'對於$ BUFFER中的i'受到路徑名擴展的限制,並且'Content-lenght:'可能出現在頭部的任何地方(作爲另一個鍵的字段)... –

+0

另外:'grep | awk'通常是個不錯的主意:'awk'/^Content-Length:/ {print $ 2; exit;}''將會是一個更好的替代品。順便說一句,冒號後面的空格是可選的,所以'$ 2'可能會或可能不會工作...... –