A ver... antes hay que resolver un tema de concepto...
¿Quieres hacer un programa en Perl, completamente en Perl, o usando comandos externos?
El problema que estás intentando resolver se puede resolver completamente en Perl. Es más, el propio Perl te va a realizar el programa por ti,
como he indicado en otro hilo.
Otro caso es usar comandos externos, como 'ls', 'locate' (este no está instalado en todos los sistemas). Esto tiene el problema de que no te funcionará en todos los sistemas (por ejemplo, en Windows, ya que no disponen del comando 'ls').
Claro que se puede resolver con esos comandos externos... con mi propuesta de 'ls -lR' obtienes una visión recursiva de todo un árbol de directorios:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use File::Basename;
use File::Listing qw(parse_dir);
## Directorio a analizar, pasado por argumento al programa
my $directorio_base = shift // $ENV{HOME};
## Comprobar que existe el directorio
if (not -d $directorio_base) {
my($filename, $directories, $suffix) = fileparse($directorio_base);
if (not -d $directories) {
die "ERROR: No encuentro el directorio $directorio_base: $!\n";
}
$directorio_base = $directories;
}
print "Analizando [$directorio_base]\n";
## Listado recursivo de directorios
$ENV{LANG} = "C"; # este módulo solo es capaz de interpretar fechas en formato original inglés
for (parse_dir(`ls -lR $directorio_base`)) {
my ($name, $type, $size, $mtime, $mode) = @$_;
next if $type ne 'f'; # solo analizaremos archivos normales
$mode = $mode & 0777; # nos quedamos con los permisos más bajos
if ($mode == 0777
or $mode == 0766
or $mode == 0666
) {
printf "\t%04o %s\n", $mode, $name;
}
}
__END__
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Using text Syntax Highlighting
explorer@casa:~/Documentos/Desarrollo> ./kk.pl ~/Documentos/Desarrollo/test
Analizando [/media/500_1/home/explorer/Documentos/Desarrollo/test]
0666 /media/500_1/home/explorer/Documentos/Desarrollo/test/test.pl~
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Pero entonces... ¿por qué no seguimos con el mismo razonamiento, y utilizamos comandos externos que ahorren aún más trabajo?
Using perl Syntax Highlighting
#!/usr/bin/perl
my $directorio_base = shift // $ENV{HOME};
print "Listado de archivos peligrosos:\n";
my @archivos = qx(find $directorio_base -type f -perm 0777 -o -perm 0766 -o -perm 0666);
print "\t$_" for @archivos;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
El verdadero reto es resolver el problema completamente en Perl