[l-linux] script bash con for y concatenacion de cadenas

Cesar Mendoza mendoza at kitiara.org
Sat Jan 11 02:05:30 CST 2003


Hola,

Aquí va otra manera de hacerlo con perl:
Dentro de /home/ftpin corres:

ls *.jpg | perl -lne '`mv $_ pipi$1-$_` if /(\d+)\.jpg$/'

y listo. Use perl ya que este era un caso perfecto para usar expresiones
regulares.


"ls *.jpg | " crea una lista de todos los archivos que terminan con jpg
en el directorio y le pasamos la lista a perl.

La opción -l -n le dice a perl que asuma que mi código esta rodeado por
el siguiente loop:
while(<>)
{
    chomp;
    #mi código aquí
}

La opción -e le dice a perl que lo que sigue es código en perl para ser
ejecutado, que en muestro caso es : `mv $_ pipi$1-$_` if /(\d+)\.jpg$/

Con lo cual el código a ejecutar seria:

while(<>)
{
    chomp;
    `mv $_ pipi$1-$_` if /(\d+)\.jpg$/;
}

while(<>) {} lo que dice que que va a ejecutar el loop por cada linea
que venga por el estándar input. En nuestro caso se ejecutaría por cada
archivo jpg en el directorio, que se guarda en la variable $_.

chomp remueve el carácter de retorno de carro (\n) al final del string
contenido en la variable $_, si la variable $_ termina con retorno de
carro.

Ahora viene la linea mágica. 
La expresión regular /(\d+)\.jpg$/ lo que dice es que estamos interesados
en un string que termina (operador $) en jpg. plus uno o mas (operador + ) 
números (operador \d) además y guardame el numero en la variable $1 (eso se 
especifica usando los paréntesis ). Cuando el string contenido en $_ cumple 
con esta expresión regular /(\d+)\.jpg$/ evalúa a TRUE y se ejecuta el código 
en frente del "if", en este caso `mv $_ pipi$1-$_`.

`` es como en bash, ejecuta el comando en el shell. Supongamos que $_
contiene popo23.jpg, el comando a ejecutar seria:

`mv popo23.jpg pipi23-popo23.jpg`
    \________/     \/ \________/
         |          |      |
         |          |      --- variable $_
         |          |
         |          - variable $1 que viene de la expresion regular.
         |
         ---variable $_

Como verán no tenia nada que hacer hoy :)

Bye
César Mendoza
http://www.kitiara.org
--
"All truth passes through three stages: first it is ridiculed,
then violently opposed and eventually, accepted as self-evident."
 -- Schopenhauer

On Fri, Jan 10, 2003 at 12:02:53PM -0600, Sebastian Muniz wrote:
> Hola hola!
> Tengo un archivo (lista.txt) que lista caminos a otros archivos mas una parte que necesito argregarles al nombre.
> A ver si soy mas claro.
> /home/ftpin
> tiene varios archivos de forma
> popo1.jpg
> popo2.jpg
> popo3.jpg ...
> y necesito moverlos a 
> pipi1-popo1.jpg
> pipi2-popo2.jpg
> pipi3-popo3.jpg
> 
> Logre guardar en un archivo las cadenas
> pip1-popo1.jpg
> pip1-popo1.jpg
> pip1-popo1.jpg
> 
> ahora, como hago para desde bash hacer el mv ?
> estoy haciendo un
> for $arch `cat lista.txt` do;
> do
> 	mv
> done
> pero ahi dentro
> 

------------------------------------------------------------------------
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