búsqueda de texto

Alvaro Herrera alvherre en alvh.no-ip.org
Sab Oct 21 12:59:59 CLST 2006


Horst H. von Brand escribió:
> Julio Pacheco <tj en vtr.net> wrote:

> > ninguna de las cuales funciona.
> > Una prueba rápida con perl -ne 'print if m#texto_a_buscar\x00\x00#' *
> > encuentra el texto, pero necesito que muestre el nombre de archivo.
> 
> Haz eso iterando sobre los archivos...

Mala idea, porque eso abriria un proceso perl por cada archivo, lo cual
es muy costoso.  Es mucho mejor hacer que el proceso Perl lea todos los
archivos de una sola pasada (o por lo menos que lea muchos archivos),
por ejemplo haciendo algo como

find /dir/donde/estan -type f | xargs perl -ne 'print $ARGV if m#texto\x00\x00#'

Claro que tambien puede hacerse dentro de perl, creo que seria algo asi

#!/usr/bin/perl
use warnings;
use File::Find;

find(\&buscar, q{/dir/donde/estan});

sub buscar {
	my $f = $File::Find::name;
	open F, $f or die "quak!: $!";
	while (<F>) {
		if (m#texto\x00\x00#) {
			print $f, "\n";
			close F;
			return;
		}
	}
	close F;
}

(sin probar por supuesto)

Es posible que sea mas eficiente hacer una busqueda preliminar de
"texto" usando el grep del sistema, y luego pasarle los nombres de los
archivos que coincidan a Perl.  Buscar en Perl es mediblemente mas
lento, hasta donde recuerdo.  Si son 20 GB estas optimizaciones son
utiles :-)

-- 
Alvaro Herrera                                http://www.PlanetPostgreSQL.org
Maybe there's lots of data loss but the records of data loss are also lost.
(Lincoln Yeoh)


Más información sobre la lista de distribución Linux