Foro de Linux - Gustavo Guillermo Software Compunauta Micro Linux (uLinux)
BUZÓN de CONSULTAS y COMENTARIOS | TEMARIO PRINCIPAL

[Gnupérnico II - MetaBuscador]


CREANDO ALGUNOS SCRIPTS EN PERL UTILES

CREANDO ALGUNOS SCRIPTS EN PERL UTILES

ME QUISE MATAR CUANDO LEI LO QUE HACIA EL COMANDO KILLALL. BUENO, ECHANDO A PERDER SE APRENDE!!!!
GENERALIDADES

Uno aprende cometiendo errore... Por ello cuando comencé en linux, descubrí que el comando kill recibía como parámetro el pid (código de proceso). Pero se me planteó el siguiente problema.... ¿Como borraba el mc de la memoria sin encontrar el PID?????. Bueno, me volví loco por que desde el entorno gráfico eso era fácil, pero desde la consola NO!!, entonces me dije que si el kpm podía hacerlo, debía ser como los dispositivo, los procesos estaban en un directorio, y ahí fue que encontré los directorios con los PIDS y un archivo en cada uno que decía cmdline. Entonces me armé de paciencia y redacté este script para borrar todos los programas cargados con ese nombre....

Script en perl para borrar procesos de la memoria...

Nos encontramos con una sección para buscar archivos usando el comando find y metiéndo los resultados en una variable, otra parte para detectar del nombre del directorio el PID, y otra para ejecutar KILL PID


#!/usr/bin/perl
print "Hello, You Want kill @ARGV";
$filetokill="@ARGV";
if ($filetokill eq ""){$filetokill="{";}
$lsout=`find /proc -xtype f -iname cmdline`;
$lsout="$lsout\n";

@lsout=split /\n/,$lsout;
foreach (@lsout){
if ($_=~/(.*):$/i){$nulo=$1;}
else {$file="$_";
	if ($file=~/cmdline/i){
	open(CMDLINE,"<$file");
	$cmdline=<CMDLINE>;
	close(CMDLINE);
	    if ($cmdline=~/$filetokill/){
	    print "found in $file\n";
		if ($_=~/proc\/(.*)\/cmdline$/){
		print "kill PID: $1\n";
		system("kill $1");
		}
	    }

			    }
	}
}


Si ahora lo retocamos.... hacemos un script para cargar todos los mp3 de un directorio en particular con el freeamp desde la consola (también funciona para el entorno gráfico).


#!/usr/bin/perl
print "Hello, You Want a mp3\n";
$pdir="@ARGV";
if ($pdir eq ""){$pdir="./";}
opendir PDIR,"$pdir" or die "Can't open the dir $pdir";
$cmdline="-L ";
while ($file= readdir PDIR){
if ($file=~/\.mp3/i){
$cmdline="$cmdline\"$pdir$file\" ";
    }

}
print "freeamp $cmdline\n\n\n\n";
exec("freeamp $cmdline");

Como no es suficiente... usamos otra vez ls (se podría utilizar find) y lo hacemos para los subdirectorios...


#!/usr/bin/perl
print "Hello, You Want a mp3\n";
$pdir="@ARGV";
if ($pdir eq ""){$pdir="./";}
print $pdir;
$lsout=`ls -R -f1 -A $pdir`;
$lsout="$lsout\n";
$cmdline="-L ";
@lsout=split /\n/,$lsout;
foreach (@lsout){
if ($_=~/(.*):$/i){$pdir=$1;}
else {$file="$pdir/$_";
	if ($file=~/\.mp3/i){
	    $cmdline="$cmdline\"$file\" ";
			    }
	}
}
print "freeamp $cmdline\n";
exec("freeamp $cmdline");

Comando para corregir los links locales de las referencias html

Cuando usamos el wget para bajar sitios web enteros, y usamos la opción -k, wget convierte los links con http:// a /, es decir que por más que lo corrija, se buscará el directorio / para el directorio raíz del sitio web, es incómodo por que muchos web designers lo usan..... Entonces este script, busca todo lo que tenga html y reemplaza llos directorios y subdirectorios por ./ y las referencias a / por ../../../../ como tantas sean necesarias. como parámetro, se le puede decir cual es el sitio web a reemplazar por ./


#!/usr/bin/perl
print "Hello, You Want to FIX HTML SLASHES\n";
$webhome="@ARGV";
$pdir="./";
$tdir="/tmp/";
@pattern=("*.htm*", "*.sht*","*.ph*","*.asp");
foreach (@pattern){
$cmdline=&addPattern($pdir,$_);
if ($cmdline ne ""){$lsout="$lsout$cmdline";}
}
@lsout=split /\n/,$lsout;$item=0;
foreach (@lsout){
	$file="$_";
	@slashes=split /\//,$file;
	    $subtree="./";
	    $counter=0;
	    foreach (@slashes){
		if ($counter>1){$subtree="../$subtree";}
	    $counter++;}
	$item++;
	    &doReplace($file,$subtree,$webhome);
	    $percent=int($item/$#lsout*100);
	    print("\r$percent\%\t:$file                                        ");
		    }
            print("\rTerminado:100%                              \n");



sub addPattern {
	my ($pdir,$pattern)=@_;
	my $cmdline=`find $pdir -xtype f -iname \"$pattern\"`;
	return ($cmdline);
}

sub doReplace{
	my ($file,$subtree,$webhome)=@_;
	open(FILETOTEST,"<$file");open(FILETOWRITE,">$temp./gusReplace.txt");
	while(<FILETOTEST>) {
	$line=$_;
	$line=~s/=\"\//=\"$subtree/gi;
	$line=~s/=\//=$subtree/gi;
	$line=~s/\/\"/\/index.html\"/gi;
	$line=~s/<base\ .*href=.*>/\ /gi;
	if ($webhome ne ""){
	$line=~s/=\"$webhome/=\"$subtree/gi;
	$line=~s/=$webhome/=$subtree/gi;
	}
	print FILETOWRITE $line;
	}
	close(FILETOTEST);close(FILETOWRITE);
	system("mv \"$temp./gusReplace.txt\" \"$file\"");

}

|Contrate Nuestra asesoría, instalación y cursos en Sistemas Linux, Redes, etc. Acerca de este sitio web Webmaster | Volver Al Inicio | Compunauta Micro Linux (uLinux) El servidor en CD, sin innstalación. |