sexta-feira, 18 de julho de 2008

Shell Script no dia-a-dia 2


Num post anterior, em Shell Script no dia-a-dia, eu falei como poderíamos utilizar shell script para diminuir o tamanho de todas as fotos em um diretório mexendo na qualidade delas. Hoje veremos uma melhoria.

Inicialmente, o script não tratava arquivos com espaços em branco no nome. Bom, depois de quebrar um pouco a cabeça desenvolvi um outro script pra tratar este problema.

A filosofia é trocar os espaços em branco por um caractere (variável $PIVO) e realizar o tratamento dos arquivos. Depois a gente renomeia de volta pro nome original. É simples, segue abaixo:

#!/bin/bash

# Definindo o diretório onde as fotos estão.
if [ $# -eq 1 ]; then
DIR=$1
else
DIR="."
fi

# Diretório destino das fotos diminuidas.
DEST="$DIR/FOTOS_DIMINUIDAS"
TEMP="/tmp/$0-`whoami`-$$"
DEST_TEMP="$TEMP/FOTOS_DIMINUIDAS"


echo
echo "As novas imagens serão enviadas para $DEST"
echo "Pressione qualquer tecla para continuar ou CTRL^C para sair"
read

# Cria diretórios se eles não existem.
test ! -e $DEST && mkdir $DEST
test ! -e $TEMP && mkdir -p $DEST_TEMP

echo
echo "Tratando fotos .jpg ou .JPG em $DIR"
echo

# funcao para diminuir a foto de entrada
diminuir(){
# Foto que será tratada.
ENTRADA="$1"
# Foto que será gerada.
SAIDA="$2"

# Verificando se a foto a ser gerada já existe.
if [ ! -e ${SAIDA} ]; then
echo "gerando ${SAIDA}"
# Comando para converter ou diminuir as fotos
convert -quality 45 "$ENTRADA" "$SAIDA"
else
echo "Não foi possível converter ${FOTO}, pois ela já existe"
echo "Pressione qualquer tecla para continuar ou CTRL^C para sair"
read
fi
}

# Mostra pontilhados (eu sempre quis fazer isso, rsrs)
mostra_pontos(){
echo -n " "
x=0
while [ $x -lt $1 ]
do
sleep 0.1 && echo -n .
x=`echo "$x + 1" | bc`
done
echo -n " "
}

# Executa rotina para cada foto no diretório
PIVO="="
for SEM_ESPACO in `ls -1 ${DIR} | grep -E "*.(jpg|JPG)" | tr [:blank:] "$PIVO" | xargs -n 1 -d "\n" echo`
do
COM_ESPACO=`echo $SEM_ESPACO | tr "$PIVO" " "`
test -f "$COM_ESPACO" && cp "$COM_ESPACO" "${TEMP}/$SEM_ESPACO"
diminuir ${TEMP}/$SEM_ESPACO ${DEST_TEMP}/$SEM_ESPACO > /dev/null
echo -n "gerando ${DEST}/$COM_ESPACO" && mostra_pontos 4
mv "${DEST_TEMP}/$SEM_ESPACO" "${DEST}/$COM_ESPACO" && echo feito
done

# Apagando diretórios temporários
rm -rf $TEMP


Nenhum comentário: