Поиск каталогов, больших определенного размера

Tech Tip: Find Directories Over a Certain Size
November 17th, 2009 by Da A Feng in HOWTOs

Исключительно просто искать большие файлы в системе с помощью find, но если вы ищете каталоги, размер которых превышает определенную величину, find не поможет. Поможет представленный здесь Perl-скрипт.

Скрипт выводит на консоль такие каталоги под указанным путём. Критический размер задаётся определенным пороговым значением. Также можно исключить из набора каталоги, имена которых соответствуют определённому шаблону.
Команда принимает следующие опции:

  • -d - Задаёт каталог верхнего уровня, от которого вниз по дереву осуществляется поиск.
  • -t - Задаёт пороговое значение в мегабайтах (то есть 100 == 100MB).
  • -x - Задаёт шаблон для исключения каталогов.

Следующий пример показывает результат применения:

$ ./file.pl -d ../../ -t 100 -x '{pr*,jd*,tp*,sim*}'
165,/export/home/fengd/CMS/apache-tomcat-6.0.13/logs
274,/export/home/fengd/CMS/apache-tomcat-6.0.13
318,/export/home/fengd/CMS
400,/export/home/fengd/apache-tomcat-6.0.13/bin
417,/export/home/fengd/apache-tomcat-6.0.13
909,/export/home/fengd
909,total
$ ./file.pl -d ../../ -t 100 -x simulator*
178,/export/home/fengd/CMS/apache-tomcat-6.0.13/logs
289,/export/home/fengd/CMS/apache-tomcat-6.0.13
333,/export/home/fengd/CMS
400,/export/home/fengd/apache-tomcat-6.0.13/bin
422,/export/home/fengd/apache-tomcat-6.0.13
757,/export/home/fengd/project/cpp/fileTrans
766,/export/home/fengd/project/cpp
334,/export/home/fengd/project/log/tmp
492,/export/home/fengd/project/log
391,/export/home/fengd/project/store/array
391,/export/home/fengd/project/store
1755,/export/home/fengd/project
133,/export/home/fengd/tptp/config
200,/export/home/fengd/tptp
105,/export/home/fengd/jdk
2994,/export/home/fengd
2994,total

Исходный код скрипта file.pl:

#!/usr/bin/perl -w
use Getopt::Std;
use Cwd 'abs_path';

my %dir;
getopt("dtx",\%dir);

if(!defined $dir{d}){

	print "Usage: program -d dir [-t threshhold] [-x exclude pattern]\n";
	exit 1;
}

if(!defined $dir{t}){

	$dir{t}=1000;
}

my $f=abs_path($dir{d});

my $cmd="du -m -c $f";

if(defined $dir{x}){

      $cmd=$cmd." --exclude=$dir{x}";
}

my $line=`$cmd`;

while($line=~/(\d+)\s+([^\r\n]+)\r?\n/g){
	if($1>$dir{t}){
		print $1.",".$2."\n";

	}
}

Скрипт использует команду du для получения информации о размерах. Шаблон исключения передаётся непосредственно du. Далее обрабатывается вывод du и из него выбираются такие, размер которых превышает порог.

Назад