martes, 17 de noviembre de 2009

Buscar directorios que sean mayor a cierto tamaño

Buscar archivos grandes en tu sistema es muy simple usando el comando find, pero si estas directorios que tengan un tamaño en particular el comando find no te podría ayudar. El siguiente código Perl, fuente de LinuxJournal, te puede ayudar a rastrear esos directorios que son grandes.

El script muestra aquellos directorios que están en cierta ruta cuyo tamaño este por encima de cierto parámetro. También permite excluir los directorios que coincidan en cierta patrón. El comando acepta los siguientes parámetros:

  • -d -Especifica el directorio donde se buscara.
  • -t -Especifica el tamaño del archivo en MB (ejemplo 100 = 100MB).
  • -x -Especifica los patrones que se ignoraran.

Los siguientes muestran como puede ser usado:


$ ./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


A continuación el código fuente del comando:

#!/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";
}
}

Este script usa el comando du para obtener el tamaño de la información. El patrón de exclusión es pasado directamente al comando du. Luego este procesa la salida de du e imprime aquellos directorios que son mayores que el parámetro.

No hay comentarios: