From mendoza at kitiara.org Sat Jan 11 02:05:30 2003 From: mendoza at kitiara.org (Cesar Mendoza) Date: Wed Aug 4 23:59:34 2004 Subject: [l-linux] script bash con for y concatenacion de cadenas In-Reply-To: <20030110120253.2161245c.smuniz@interlap.com.ar> References: <20030110120253.2161245c.smuniz@interlap.com.ar> Message-ID: <20030111080530.GA2419@tyka.kitiara.org> 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 colocando en el cuerpo: "UNSUBSCRIBE caracas-pm-list" para desuscribirse. "INFO caracas-pm-list" para conocer las reglas de etiqueta. ------------------------------------------------------------------------