Foros del Web » Administración de Sistemas » Unix / Linux »

Mi primer shellscript

Estas en el tema de Mi primer shellscript en el foro de Unix / Linux en Foros del Web. Estoy trabajando en un catálogo de productos con cientos de imágenes de alta resolución y diferentes tamaños, separadas en decenas de directorios. Podría haber utilizado ...
  #1 (permalink)  
Antiguo 21/03/2009, 18:47
Avatar de arthpix  
Fecha de Ingreso: diciembre-2003
Ubicación: Cancún
Mensajes: 2.340
Antigüedad: 20 años, 11 meses
Puntos: 93
Mi primer shellscript

Estoy trabajando en un catálogo de productos con cientos de imágenes de alta resolución y diferentes tamaños, separadas en decenas de directorios.
Podría haber utilizado la extensión GD2 de PHP, pero no quería subir los archivos a ftp.
Pensé en utilizar la poderosa acción "batch process" de GIMP, pero no me permite añadir recursivamente desde un directorio todos los archivos contenidos en subdirectorios, por otro lado Photoshop y su procesamiento por lotes no me permite ser selectivo en el "aspect ratio".
Así que decidí crear un shellscript que utilizando el comando convert de Imagemagick realizara la tarea. Me puse manos a la obra y este fue el resultado:

Código:
#!/bin/bash
# Script creado por Arturo Peraza ([email protected])
# Este script esta licenciado bajo licencia GPL

# Avisos al usuario
echo "Este script generará un subdirectorio de respaldo llamado tmp"
echo "Los archivos originales serán copiados en el y si todo sale bien seran eliminados"
echo "Si desea conservar los archivos originales copielos en otra ubicación antes de continuar"

# Pausa para que el usuario lea los avisos
read -p "'Presione Intro para continuar'"

# Mirar si existe el directorio tmp y si no crearlo
if ls | grep tmp
then
   echo "Creando respaldos..."
else
   mkdir tmp
   echo "Creando respaldos..."
fi

# Copiar todos los archivos al directorio tmp y redimensionar los originales
for i in `ls *.jpg` ; do
cp $i tmp/$i
convert $i -resize 350x350 $i
done
clear

# Pausa para que el usuario revise que todo salio bien
read -p “'Revise los archivos resultantes y presione Intro para continuar'”
clear
echo "Los siguientes archivos fueron redimensionados con exito:"

# Mirar si los respaldos fueron creados y en su caso eliminarlos
if ls tmp | grep jpg
then
   rm -rf tmp
   exit
else
   echo "No hay respaldos, Probablemente ocurio algun error"
   echo "Revise los archivos y permisos e intentelo de nuevo"
fi
Lo posteo aquí para quien pueda resultarle útil y por supuesto, aprovechando la generosidad de los foreros más avanzados si tienen alguna sugerencia para mejorar su funcionalidad o cualquier cosa que sea más facil o que se haga de manera más correcta también la compartan con nosotros.


Cualquier crítica será bienvenida, solamente sean benévolos si cometí muchos errores de principiante


Saludos
__________________
Antes de hacer rabietas infórmate: Linux != Windows
  #2 (permalink)  
Antiguo 21/03/2009, 19:28
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 20 años, 4 meses
Puntos: 76
Respuesta: Mi primer shellscript

Más simple. En vez de esto:

Cita:
for i in `ls *.jpg` ; do
cp $i tmp/$i
Podrías haber hecho esto:

Cita:
cp *.jpg tmp/
Y si sólo querías cambiar el tamaño de las imágenes, con MOGRIFY es más sencillo. En vez de esto:

Cita:
for i in `ls *.jpg` ; do
convert $i -resize 350x350 $i
Podías haber hecho esto:

Cita:
mogrify -resize 350x350 *.jpg
Por otra parte, ¿para qué haces los respaldos si los borras inmediatamente?

Y ya para rizar el rizo... la nota de licencia es incorrecta. Por ejemplo, no especificas qué versión de la licencia es aplicable. Un ejemplo de nota de licencia bien escrita es el siguiente:

Cita:
Copyright (C) 2009 Arturo Peraza ([email protected])

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
O en castellano llano:

Cita:
Copyright (C) 2009 Arturo Peraza ([email protected])

Este programa es software libre: puedes redistribuirlo y/o modificarlo
bajo las condiciones de la GNU General Public License según es publicada por
la Free Software Foundation, bien la versión 3 de la Licencia, bien
(a tu elección) cualquier versión posterior.

Este programa se distribuye con la intención de resultar de utilidad,
pero SIN NINGUNA GARANTÍA; incluso sin garantía implícita de
COMERCIABILIDAD o ADECUACIÓN PARA CUALQUIER PROPÓSITO PARTICULAR.
Véase la GNU General Public License (Licencia Pública General GNU) para más detalles.

Deberías haber recibido una copia de la GNU General Public License
junto con este programa. En caso contrario, consulta <http://www.gnu.org/licenses/>.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #3 (permalink)  
Antiguo 21/03/2009, 20:42
Avatar de arthpix  
Fecha de Ingreso: diciembre-2003
Ubicación: Cancún
Mensajes: 2.340
Antigüedad: 20 años, 11 meses
Puntos: 93
Respuesta: Mi primer shellscript

Gracias Defero.tk, tienes razón, no es necesario el loop for y por otro lado mogrify es más simple en ese caso si no se van a generar respaldos.

Lo de los respaldos lo dejé asi para dar oportunidad al usuario final de revisar si los archivos están correctos despues de redimiensionarlos.

Excelente con la nota de la licencia, estudio el link que me dejaste.

Por otro lado, revisando aquí cual es la diferencia entre mogrify y convert (solamente difiere en que el archivo original es sobre-escrito) pero me dio la idea de extender el script para que lea todos los archivos de imagen y que el usuario pueda elegir el formato resultante.

También deseo extenderlo para poder ejecutarlo ingresando la ruta a otro directorio y hacerlo recursivo, ya veré como va y posteo aqui los cambios.

Saludos



PD: Sabía que ibas a ser tú el primero en comentar... ¿tienes algun script o lector RSS todo el dia?
__________________
Antes de hacer rabietas infórmate: Linux != Windows

Última edición por arthpix; 21/03/2009 a las 20:55
  #4 (permalink)  
Antiguo 22/03/2009, 07:02
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 20 años, 4 meses
Puntos: 76
Respuesta: Mi primer shellscript

No, tengo insomnio.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #5 (permalink)  
Antiguo 07/04/2009, 18:11
rqd
 
Fecha de Ingreso: julio-2008
Mensajes: 228
Antigüedad: 16 años, 4 meses
Puntos: 8
Respuesta: Mi primer shellscript

También podrías cambiar el if

Código:
if ls | grep tmp
por

Código:
if test -d tmp
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:17.