Ivan30 писал(а):открыть папку с кешем, поиск->найти все файлы с расширением таким-то->отсортировать по размеру->выделить->удалить
Кэш из пары сотен
миллионов тайлов смотрит на этот совет грустно и в то же время с изумлением...
PS:
Код: Выделить всё
use File::Basename;
use Digest::MD5;
require "settings.txt";
system "cls";
my $baddir=$folder_bad;
my $dir=$folder_to_cleanup;
my $deleteflag=$deleteflag;
&recur_init($baddir);
print "-------------------------------------------------------------------------------\n";
print "Всего найдено ".($i/2)." плохих тайлов.\n";
$nulled=0;
$size=0;
$size_hash=0;
&recur($dir);
print "-------------------------------------------------------------------------------\n";
print "Нулевых тайлов : ".$nulled."\n";
print "Совпадений размеров : ".$size."\n";
print "Совпадений размеров И хэшей: ".$size_hash."\n";
exit;
sub recur_init{
my $dir = shift;
opendir DIR, $dir or return;
my @contents = map "$dir/$_", sort grep !/^\.\.?$/, readdir DIR;
closedir DIR;
$i=0; @bad_array = ();
foreach (@contents){
if (!-l && -d){
recur_init($_);
}
else{
$name=basename($_);
print "".(($i/2)+1).". Найден плохой тайл \"".$name."\"\n";
$blob=blob($_);
$tilesize=length($blob);
$ctx = Digest::MD5->new;
$ctx->add($blob);
my $tilehash = $ctx->hexdigest;
print " |-length = ".$tilesize." байт\n";
print " |-hash = ".$tilehash."\n";
print "\n";
push @bad_array,$tilesize;push @bad_array,$tilehash;
$i=$i+2;
}
}
}
sub recur{
my $dir = shift;
opendir DIR, $dir or return;
my @contents = map "$dir/$_", sort grep !/^\.\.?$/, readdir DIR;
closedir DIR;
foreach (@contents){
if (!-l && -d){
recur($_);
}
else{
print $_."\n";
my $tilesize=(-s($_));
if ($tilesize==0) {
#тайл нулевой длины
if ($deleteflag == 1) {
$file=$_;
$file=~tr/\//\\/;
unlink ("$file") || warn "Cannot delete file $file:", $!;
print "Тайл ".($_)." удален (длина 0 байт).\n";
}
$nulled++;
}
else {
for ($ii=0;$ii<$i;$ii=$ii+2) {
if ($tilesize == $bad_array[$ii]) {
$size++;
#считаем хэш
$blob=blob($_);
$ctx = Digest::MD5->new;
$ctx->add($blob);
my $tilehash = $ctx->hexdigest;
if ($tilehash eq $bad_array[$ii+1]) {
print "Тайл нашего размера и нашего хэша.\n";
if ($deleteflag == 1) {
$file=$_;
$file=~tr/\//\\/;
print $file."\n";
unlink ("$file") || warn "Cannot delete file $file:", $!;
print "Тайл ".$file." удален (длина И хэш совпали).\n";
}
$size_hash++;
}
}
else {
}
}
}
}
}
}
sub blob {
open (BLOB, "<", shift) or die "Can't open file!";
my $data; my $blob;
binmode BLOB;
while (!eof(BLOB)) {
read(BLOB,$data,8);
$blob .= $data;
};
close BLOB;
return $blob;
}
В папку /bad кидаем все "плохие" тайлы, которые
НЕ нужны (число оных не ограничено).
Скрипт ищет совпадения в кэше по размеру тайлов с плохими. Рекурсивно (читай - размер кэша неважен). При нахождении совпадения по размеру -
дополнительно проверяет совпадение MD5-хэша с плохим тайлом, и если сходится - то либо удаляет, либо только рапортует (зависит от настроек).
Бонусом убивает тайлы нулевого размера (ошибки скачки с сервера).
Сделайте мне спасибу, да. Админ сегодня щедрый.
