[l-linux] buscar y reemplazar

Ernesto Hernandez-Novich emhn at telcel.net.ve
Wed Oct 9 08:43:56 CDT 2002


On Tue, 8 Oct 2002, Alejandro Aranguren wrote:
> lei sobre find y fgrep y no entiendo como usarlos.

find busca archivos según varios criterios (nombre, tamaño, dueño)
y emite una lista con los archivos encontrados. fgrep busca una
expresión constante (usualmente una cadena de caracteres) dentro de uno
o más archivos.

> Lo que quiero es buscar en una o varias carpetas todos los archivos que
> adentro tengan alguna palabra o secuencia de palabras y el mismo comando
> me reemplace por otra palabra que yo quiera cambiar.

Puedes usar find para construir la lista de archivos

find /directorio -print

Sin embargo, para editar no te va a servir fgrep (que solamente
_busca_), sino que deberías usar sed sobre cada archivo. El manual
de find sugiere leer

info Finding Files

para tener más ejemplos de uso. El concepto general es construir la
lista de archivos con find y utilizarla para alimentar a sed; como find
emite su lista de archivos por la salida estándar y sed los espera
en la línea de comando, hay que apoyarse en xargs para que haga la
transformación

find /directorio -print | xargs sed <comando-apropiado-para-editar>

sed tiene su propia idiosincracia en cuanto a las operaciones de
edición, y el manual es bastante explícito.

Por supuesto, uno puede ir con Perl y escribir

use File::Find;
sub wanted {
 my $o = $File::Find::name;
 my $n = "$o.temporal";
 open O,"<$o";
 open N,">$n";
 while (<O>) {
   s/foo/bar/g;      # O cualquier basura que uno quiera editar
   print N $_;
 }
 close O;
 close N;
 rename($o,"$o.backup");  # Copia del original, por si acaso.
 rename($n,$o);
}
find(\&wanted,'/directorio','/otro/directorio');

Caveat Emptor: rename() no funciona si el viejo y el nuevo están en
sistemas de archivo diferentes, por eso es que tengo que crear el archivo
intermedio. Si se sospecha que alguien puede estar modificando cosas al
mismo tiempo que este programa, es conveniente utilizar algún tipo de
bloqueo sobre los archivos (flock).
-- 
Ernesto Hernández-Novich - Running Linux 2.4.19 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't apt-get it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3

------------------------------------------------------------------------
Enviar e-mail a <majordomo at pm.org> colocando en el cuerpo:
"UNSUBSCRIBE caracas-pm-list" para desuscribirse.
"INFO caracas-pm-list" para conocer las reglas de etiqueta.
------------------------------------------------------------------------



More information about the caracas-pm mailing list