[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