Данный скрипт создан для удаления архивных файлов системы видеонаблюдения. Он получает в качестве входных параметров папку для сканирования и максимальное кол-во дней жизни файла.
Объем этих файлов такой, что за 10-12 дней они заваливают 60Гб винт, после чего комп естественно начинает глючить. Пришлось написать этот скрипт...
Суть работы:
Этот скрипт удаляет файлы на винчестере! Будьте осторожны в использовании!
При запуске скрипт сканирует указанную директорию ($dirnow) и ее поддиректории вида YYYY_MM_DD.
Скрипт заходит в каждую поддиректорию.
Если дата создания поддриектории отличается от текущей даты более чем на ХХ дней ($days), он заходит в эту директорию и удаляет в ней ВСЕ файлы.
После удаления всех файлов директории, скрипт удаляет саму диреторию тоже.
После удаления всех поддиреторий, скрипт удаляет и содержащую их директорию.
Имена всех удаленных файлов и директорий пишутся в лог-файл с именем DDMMYYYY.txt в директории запуска скрипта.
Скрипт не рекурсивный. Он расчитал на 3 уровня вложенности!
Исходный код:
#!/usr/bin/perl
use Time::Local;
use File::Path;
$dirnow="e:/events/";
$days=10;
$i=$k=$j=0;
$now=scalar(localtime);
&SplitTime($now);
$d_id=$now{"day_now"};
if ($d_id < 10) {$d_id = "0$d_id";};
$m_id_num=&GetMonthEnNumber($now{"month_now"});
$path=$d_id.$m_id_num.$now{"year_now"};
$suf=".txt";
open (FILE,">>$path$suf") || die "Can not create file: \n $! \nand\n $^E";
opendir (DIR, $dirnow) || die "couldn't open $dirnow : $!\n";
while ( defined ($file[$i]=readdir DIR)) {
next if $file[$i]=~ /^\.\.?$/;
($yyyy,$mm,$dd)=split('_',$file[$i]);
$mm=~ s/^0//;
$dd=~ s/^0//;
if ($dd) {
$foldtime = timelocal (0,0,0,$dd,$mm-1,$yyyy-1900);
$t=(time-$foldtime)/86400;
if ($t>$days) {
opendir (DIR2, "$dirnow$file[$i]/") || die "couldn't open $dirnow$file[$i] : $!\n";
while ( defined ($file2[$k]=readdir DIR2)) {
next if $file2[$k]=~ /^\.\.?$/;
opendir (DIR3, "$dirnow$file[$i]/$file2[$k]/") ||
die "couldn't open $dirnow$file[$i]/$file2[$k] : $!\n";
while ( defined ($file3[$j]=readdir DIR3)) {
next if $file3[$j]=~ /^\.\.?$/;
print FILE "\tdelete file: $dirnow$file[$i]/$file2[$k]/$file3[$j]\n";
unlink "$dirnow$file[$i]/$file2[$k]/$file3[$j]";
}
closedir (DIR3);
print FILE "delete folder: $dirnow$file[$i]/$file2[$k]/\n";
rmdir "$dirnow$file[$i]/$file2[$k]/";
}
closedir (DIR2);
print FILE "delete folder: $dirnow$file[$i]/\n\n";
rmdir "$dirnow$file[$i]/";
}
}
}
closedir (DIR);
close (FILE);
sub SplitTime {
$now=~ s/ / /g;
$now=~ s/ /:/g;
@now=split(/:/,$now);
$now{"month_now"}=@now[1];
$now{"day_now"}=@now[2];
$now{"year_now"}=@now[6];
}
sub GetMonthEnNumber {
@mid_en=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
foreach $i (0 .. $#mid_en){
if ($_[0] eq @mid_en[$i]){$month_num=$i+1;};
};
if ($month_num < 10) {$month_num = "0$month_num";};
return $month_num;
}
<!-- спасибо! -->
: BBCode
: HTML
<!-- внимание! -->
Код, текст и фотографии размещенные на этом сайте принадлежат их автору - Сапронову Артёму Александровичу.
Допускается использование материалов сайта в личных целях.
Приветствуется распространение с обязательным указанием активной гиперссылки на страницу, с которой взят материал.
Запрещается внесение изменений в исходный текст (в том числе синонимизация и рерайт).
Использование материалов сайта в коммерческих целях без согласования с автором запрещено.
Обращайте внимание на даты. Некоторые страницы морально устарели.
Автор не несет отвественности за любые возможные последствия связанные с использованием материалов сайта.
С предложениями, замечаниями или пожеланиями обращайтесь по email.