2015-10-06 3 views
2

Я имею Files.txt, который состоит из списка URL-адресов файлов Excel:Загрузить файлы, которые больше, чем определенный размер

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.

Мой вопрос заключается в том, как автоматизировать это куском Bash или Perl. Особенно я не знаю, как извлечь и делает сравнение ...

Может ли кто-нибудь помочь?

ответ

3

Вы можете использовать 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 из HEAD вы хотите этот файл.

1

Чтобы адаптироваться к различным форматам HTTP и их контенту, некоторый тип соответствия шаблонов может быть осмотрительным. Вот грубый пример того, как использовать сопоставление Глоб в оболочке для достижения этой цели:

#!/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

Это слово нарушено хотя бы двумя способами: 'для i в $ BUFFER' подлежит расширению имени пути, а' Content-Lenght: 'может появляться в любом месте заголовка (как поле другого ключа) ... –

+0

Также: 'grep | awk', как правило, плохая идея: 'awk '/^Content-Length:/{print $ 2; exit;}'' будет лучшей заменой. Кстати, пространство после двоеточия является необязательным, поэтому '$ 2' может работать или не работать ... –

Смежные вопросы