Ayuda con script bash

Necesito hacer un script que, entre otras cosas, me redimensione las fotos de un directorio y me guarde los archivos nuevos con un nombre derivado del original.
P.e. Tengo la foto 123456.jpg y necesito que cree las 123456_h.jpg, 123456_s.jpg y 123456_m.jpg.

Mi problema viene en que no se como automatizar el nombre de los archivos.
Si pudiera (que no se si se puede) usar el nombre de la foto original como v ariable dentro del script lo solucionaría pero no encuentro la forma de hacerlo.

Me daría igual que lo pudiera hacer directamente en la misma linea que el rimensionado o tener que crear antes los archivos.

Muchas gracias.
Es factible, son variables no tan complejas, se usan comodines, variables y un bucle.

Imagemagick o semejante creo que te seria muy útil para hacer procesos de tratamiento por lotes de imágenes. También mediante gimp y comandos puede hacerse ello.

Me imagino que querrás tener todas esas imágenes en baja, media y alta resolución, por ej... para un álbum ^^, o incluso para algún juego (pero para eso seria mejor optimizar mas meticulosamente).

Estilo... no se... : Para *.jpg en carpetax redimensionar con parametrosH y guardar como ./modificados/nombreoriginal+H.jpg y repetir con S y M, luego continuar hasta terminar carpeta.

Si lo quieres es aprender como hacer el script así te puedes hacer una buena idea =D.
Justo es eso lo q quiero. Y justo es imagemagick lo q voy a usar.
Pero no se como puedo leer el nombre original para ponerselo a las imagenes modificadas. Lo unico q se me ocurre es hacer un ls, guardar el resultado en un archivo y desde hay ir cogiendo los nombres para modificarlos. Pero me parece "poco elegante". Si hubiera otra forma mas elegante me encantaria usarla.
Muchas gracias.
Esog Enaug escribió:Justo es eso lo q quiero. Y justo es imagemagick lo q voy a usar.
Pero no se como puedo leer el nombre original para ponerselo a las imagenes modificadas. Lo unico q se me ocurre es hacer un ls, guardar el resultado en un archivo y desde hay ir cogiendo los nombres para modificarlos. Pero me parece "poco elegante". Si hubiera otra forma mas elegante me encantaria usarla.
Muchas gracias.


Igual que dices que modifique ese archivo, puedes decirle que coja el nombre de ese archivo ^^, luego le concatenas lo que le quieras añadir al guardar el resultado de esa modificacion =D.

No necesitaras ni ls, ni archivos ajenos, ni nada, solo trabajar con variables si eso.
wenasss

el proceso para recorrer el directorio actual seria este...

for LISTA in $(ls -1 *.jpg | sed 's/\(.*\)\..*/\1/')
do
  convert $LISTA.jpg $LISTA_s.jpg
  convert $LISTA.jpg $LISTA_m.jpg
  convert $LISTA.jpg $LISTA_b.jpg
done

esto recorreria el directorio actual
y convertiria las imagenes en los 3 formatos(faltan las opciones que quieras para las fotos)
pondra el mismo nombre que el original con el sufijo y la extension

el comando
ls -1 *.jpg | sed 's/\(.*\)\..*/\1/

lista todos los archivos .jpg de la ruta actual, y elimina la extension del archivo(aunque no fisicamente) para poder tratarlo
blackgem escribió:Igual que dices que modifique ese archivo, puedes decirle que coja el nombre de ese archivo ^^, luego le concatenas lo que le quieras añadir al guardar el resultado de esa modificacion =D.

No necesitaras ni ls, ni archivos ajenos, ni nada, solo trabajar con variables si eso.


Eso es lo que quiero hacer pero no se como hacerlo. He probado con todo lo que se me ha ocurrido pero no lo logro hacer.
Sigu buscando y esperando ayuda.
Gracias a todos.
el script en si...
pon las opciones que mas prefieras para los convert y ya estara listo el script

#!bin/bash
#pon aqui debajo,el directorio donde tienes las fotos, sin barra al final
RUTA=~

for LISTA in $(ls -1 $RUTA/*.jpg | sed 's/\(.*\)\..*/\1/')
do
  convert $RUTA/$LISTA.jpg $LISTA_s.jpg
  convert $RUTA/$LISTA.jpg $LISTA_m.jpg
  convert $RUTA/$LISTA.jpg $LISTA_b.jpg
done

Lok escribió:el script en si...
pon las opciones que mas prefieras para los convert y ya estara listo el script

#!bin/bash
#pon aqui debajo,el directorio donde tienes las fotos, sin barra al final
RUTA=~

for LISTA in $(ls -1 $RUTA/*.jpg | sed 's/\(.*\)\..*/\1/')
do
  convert $RUTA/$LISTA.jpg $LISTA_s.jpg
  convert $RUTA/$LISTA.jpg $LISTA_m.jpg
  convert $RUTA/$LISTA.jpg $LISTA_b.jpg
done



No funciona y no me lo explico :-? :-? :-?
Primero una corrección, hay que declarar la variable LISTA (ya lo he hecho), pero no funciona.
Lo he dejado así, para ejecutarlo desde la misma carpeta (ya probé con la ruta y me da el mismo resultado)
#!bin/bash
LISTA=1
for LISTA in $(ls -1 *.jpg | sed 's/\(.*\)\..*/\1/')
do
  convert $LISTA.jpg -resize 100x100 $LISTA_s.jpg
  convert $LISTA.jpg -resize 200x $LISTA_m.jpg
  convert $LISTA.jpg -resize 150x150 $LISTA_h.jpg
done

Y no hace nada.

Encabezonado en que me funcione he escrito este otro script:

#!bin/bash
ls > listadoA.txt
tr -d [a-z][A-Z].<listadoA.txt >listado.txt
LINEA="1"
while read LINEA
do
  convert $LINEA.jpg -resize 100x100 $LINEA_s.jpg
  convert $LINEA.jpg -resize 200x $LINEA_m.jpg
  convert $LINEA.jpg -resize 150x150 $LINEA_h.jpg
done < listado.txt
rm listadoA.txt
rm listado.txt

y tampoco funciona. Ninguno de los dos me tira ningún error, ni por consola ni desde nautilus.
He probado los comandos convert a "mano" y funcionan perfectamente.
Voy a probar metiendo algun "echo" para ver que va pasando.


SOLUCIONADO

Ya lo tengo XD [360º] [sonrisa] :

#!bin/bash
RUTA=/home/XXXXXXXXXX/ScripsFotosWEB/img
LISTA="1"
for LISTA in $(ls -1 $RUTA/*.jpg | sed 's/\(.*\)\..*/\1/')
do
  echo "$LISTA"
  convert $LISTA.jpg -resize 100x100 $LISTA'_s'.jpg
  convert $LISTA.jpg -resize 200x $LISTA'_m'.jpg
  convert $LISTA.jpg -resize 150x150 $LISTA'_h'.jpg
done


Faltaban los acentos en el añadido al nombre (menuda tonteria).
Además no hay que poner la variable $RUTA antes del nombre de la foto a convertir, ya lo lleva incluido (bendito echo).

Lo seguiré modificando para que me pregunte la ruta y me convierta las imágenes en jpg (las que estén en otro formato), pero el cuerpo principal ya está resulto.

Os dejo tambien el que yo escribí, que se apoya en dos archivos txt. El resultado es igual de bueno, aunque es menos elegante, pero uso la orden "tr" que no conocía:

#!bin/bash
RUTA=/home/XXXXXXXXXX/ScripsFotosWEB/img
ls $RUTA/> listadoA.txt
tr -d [a-z][A-Z].<listadoA.txt >listado.txt
LINEA="1"
while read LINEA
do
  convert $RUTA/$LINEA.jpg -resize 100x100 $RUTA/$LINEA'_s'.jpg
  convert $RUTA/$LINEA.jpg -resize 200x $RUTA/$LINEA'_m'.jpg
  convert $RUTA/$LINEA.jpg -resize 150x150 $RUTA/$LINEA'_h'.jpg
done < listado.txt
rm listadoA.txt
rm listado.txt


Muchas gracias a todos y espero que, por lo menos, os haya "descubierto" la orden tr (para modificar un archivo de texto)
en bash no hace falta declarar las variables antes de usarlarlas.
aunque los arrays si.
Habia leido que habia que daclararlas antes. Pero eso era lo de menos. Lo mejor es que ya está solucionado, y de dos formas diferentes.
9 respuestas