Один способ использовать perl
.
Содержание script.pl
:
use warnings;
use strict;
use Archive::Extract;
use List::Util qw|first|;
use File::Copy qw|move|;
use File::Spec;
use File::Path qw|remove_tree|;
## Path to save 'xml' and 'zip' files.
my $big_files_dir = qq|$ENV{HOME}/big_files/|;
## Temp dir to extract files of 'zips'.
my $zips_path = qq|/tmp/zips$$/|;
## Size in bytes to check 'xml' files.
my $file_max_size_bytes = 100 * 1024 * 1024;
my (@zips_to_move, $orig_zip);
## Get files to process.
my @files = <*.xml *.zip>;
## From previous list, copy 'xml' files bigger than size limit.
for my $file ( @files ) {
if ( substr( $file, -4 ) eq q|.xml| and -s $file > $file_max_size_bytes ) {
move $file, $big_files_dir;
}
}
## Process now 'zip' files. For each one remove temp dir to avoid mixing files
## from different 'zip' files.
for ( grep { m/\.zip\Z/ } @files ) {
remove_tree $zips_path;
$orig_zip = $_;
handle_zip_file( $orig_zip );
}
## Copy 'zip' files got until now.
for my $zip_file ( @zips_to_move ) {
move $zip_file, $big_files_dir;
}
## Traverse recursively each 'zip file. It will look for 'zip' file in the
## subtree and will extract all 'xml' files to a temp dir. Base case is when
## a 'zip' file only contains 'xml' files, then I will read size of all 'xmls'
## and will copy the 'zip' if at least one of them if bigger than the size limit.
## To avoid an infinite loop searching into 'zip' files, I delete them just after
## the extraction of its content.
sub handle_zip_file {
my ($file) = @_;
my $ae = Archive::Extract->new(
archive => $file,
type => q|zip|,
);
$ae->extract(
to => $zips_path,
);
## Don't check fails. I don't worry about them, ¿perhaps should I?
unlink( File::Spec->catfile(
(File::Spec->splitpath( $zips_path ))[1],
(File::Spec->splitpath( $file ))[2],
)
);
my $zip = first { substr( $_, -4 ) eq q|.zip| } <$zips_path/*>;
if ( ! $zip ) {
for my $f ( <$zips_path/*.xml> ) {
if ( substr( $f, -4 ) eq q|.xml| and -s $f > $file_max_size_bytes ) {
push @zips_to_move, $orig_zip;
last;
}
}
return;
}
handle_zip_file( $zip );
}
Некоторые проблемы:
xml
файлы с тем же именем в поддереве a zip
файл будет перезаписан при копировании во временный dir.xml
больше, чем 100 МБ. Это было бы быстрее для проверки каждый раз, когда я извлекаю zip-файл. Это может быть улучшено.~/big_files
должен существовать и быть перезаписываемыми.zip
и xml
файлы.Это не прекрасно, как Вы видите в предыдущих точках, но это работало в моем тесте. Я надеюсь, что это может быть полезно для Вас.
Выполните его как:
perl script.pl
Каталог, возможно, был сделан только для чтения, или возможно файл был сделан неизменным через расширенные атрибуты. Но я сознательно не скажу Вам, как зафиксировать это, потому что это не правильный способ продолжиться. Когда машина была заражена вредоносным программным обеспечением, Вы не можете знать что не так. Существует хороший шанс, что ядро заражено также, и что любой фиксирует Вас, попытка, будет только казаться, будет успешно выполняться.
Уничтожьте его с орбиты. Другими словами, выбросьте существующую установку и переустановите систему с нуля. Вы захотите скопировать данные. Идеально, восстановите его от известного хорошего резервного копирования. Если Вы не имеете полного хорошего резервного копирования, восстановления от последнего хорошего резервного копирования и тщательно копируете более свежие файлы. Но необходимо переустановить операционную систему. Обязательно вытрите существующее ядро и установку системы, постарайтесь не случайно иметь в наличии зараженные файлы. Лучше, установите на новом диске, имея в наличии старый (ничего никогда не выполняя от него) для выяснения то, что произошло так, чтобы этого не происходило снова.