Вобщем после дня эксперементов наваял я довольно простенький (и наверно всё же кривоватый) скрипт:
use strict;
my $s_root = \'\';
my $dir_size = 0;
my $file_size = 0;
my $t_dir_size = 0;
my $dir_name = \'\';
sub dir_ls {
my $save_dir;
my $root = shift;
local *DIR_LS;
opendir DIR_LS ,$root;
while (my $file = readdir (DIR_LS) ) {
next if $file =~ /^\\.\\.?$/;
next if $root =~ /^\\.\\.?$/;
if (-d "$root/$file") {
dir_ls ("$root/$file");
} else {
$dir_size += (stat("$root/$file"))[7];
}
}
#print "$s_root : $dir_size\\n";
}
$dir_name="e:\\\\111";
chdir($dir_name);
opendir(D,$dir_name);
while($s_root=readdir(D)) {
if (-d "$s_root") {
dir_ls ($s_root);
print "$s_root : $dir_size\\n";
$t_dir_size += $dir_size;
}
else {
$file_size += (stat("$s_root"))[7];
}
$dir_size = 0;
}
closedir(D);
print "Files in root directory: $file_size\\n";
$t_dir_size += $file_size;
print "\\nTotal: $t_dir_size\\n";
Он проходит по заданной папке и выводит объём всех подпапок + отдельно объём файлов в корне указаной папки... Теперь решил прикрутить помимо подсчёта объёма всей подпапки ещё и объём файлов в ней по маске - например *.mp3 - по предложеной на форуме кнструкции:
my $size = 0;
$size += (stat($_))[7] for (glob(\'e:/111/*.mp3\'));
print "Size *.mp3 - $size bite";
Соответственно в скрипт написанный выше добавил:
................
} else {
$dir_size += (stat("$root/$file"))[7];
[b]$dir_size_mp3 += (stat("$root/$file"))[7] for (glob("$root/$file/*.mp3"));[/b]
}
}
#print "$s_root : $dir_size\\n";
}
...............
[b]print "MP3 in: $dir_size_mp3\\n\\n";[/b]
Но что-то не катит... просто записывает в $dir_size_mp3 какое-то число... !?!?!? В чём может быть дело!?
Phoinix Phoinix:
Вообще проверять Regexp каждый элемент массива - непрактично, проще перед циклом просто напросто два раза повторить readdir:
readdir DIR_LS; readdir DIR_LS; while (my $file = readdir (DIR_LS) ) { #next if $file =~ /^..?$/;
проще действительно... у меня не пошло..... может дело в том, что функция рекурсивно вызывется!?