2016-08-08 2 views
2

Недавно я столкнулся с некоторой проблемой с длинным работающим сценарием (и работал) и пришел к выводу, что для решения этой проблемы должен быть более эффективный подход.Perl unzip/динамическое именование и обработка ошибок

Один раз в день файл отправляется по электронной почте на общую учетную запись. Postfix передает его на этот скрипт для обработки, по сути, он просто ищет любые вложения файлов и сохраняет их. 99.9% времени есть только 1 вложение, zip-файл, и он отправляется с расширением .DOC, чтобы получить его через спам-фильтр.

Иногда, однако, файл отправляется как 'file.DOC' other times 'file.doc', а файл других пользователей 'file.doc.zip' или 'file.DOC.zip'. В каждом случае есть только 1 файл прилагается, но для того, чтобы справиться с этими сценариями моего сценарий выглядит следующим образом:

if (</tmp/*.doc>){ 
     unzip '</tmp/*.doc>' => '</media/win/#1.txt>' 
       or die "unzip failed: $UnzipError\n"; 
} 

if (</tmp/*.DOC>){ 
     unzip '</tmp/*.DOC>' => '</media/win/#1.txt>' 
      or die "unzip failed: $UnzipError\n"; 
} 

есть ли лучший способ справиться с этим возможными условиями с именованием файлов, которые я не могу контролировать? Это могут быть .zip, .ZIP, .DOC, .doc или что-то еще, что человек решает ввести этот день, несмотря на четкие инструкции. (Разве это не всегда так? »Обычно я знаю, насколько велика будет файл - могу ли я разархивировать его на основе этого или найти другой способ не-filename?

+0

Когда корпус может меняться, я обычно достигаю 'lc' и сравниваю это. – squiguy

ответ

0

Вы можете grep все файлы с помощью с .doc и .zip расширения без учета регистра и делать то, что вам нужно сделать с ними:

opendir(DIR, '/tmp/'); 
my @files = grep {/\.(doc|zip)$/i} readdir(DIR); 
closedir DIR; 

foreach my $file (@files) { 
    #do what you need to do with each file 
} 
0

Я хотел бы предложить, избегая имен файлов - вы ищете почтовые файлы, так использовать его в качестве фильтра:

use File::Type; 
my $ft = File::Type->new(); 

opendir(DIR, '/tmp/'); 
my @files = grep { $ft->mime_type($_) =~ qr"application/zip" } readdir(DIR); 
closedir DIR; 

foreach my $file (@files) { 
    #do what you need to do with each file 
} 
Смежные вопросы