Usando Bash Scripts

Usando Bash Scripts

Um dos motivos pelo qual eu uso Linux no meu dia a dia, é que ele, ao contrario do que o tato pensa, agiliza minhas tarefas, e aqui eu vou dar um exemplo do poder do linux.

Vamos utilizar o bash para converter imagens tiradas com uma câmera digital para o formato 648×486 e tambem gerar uma versão menor 140×105 para usarmos como snapshot em uma pagina html :D.

Bom, primeiro, precisamos de um diretorio para colocar as fotos originais, que normalmente são do tamanho 2592×1944. O diretório escolhido é origin. criamos os diretórios para as fotos que serão colocadas no site, e para os snapshots, fotos e snaps respectivamente

>mkdir origin
>mkdir fotos
>mkdir snaps

agora, precisamos gerar um arquivo de script gera_html.sh que sera executado para gerar as fotos, e dar-lhe permissão de execução.

>chmod u=u+x gera_html.sh

Agora vamos fazer um loop de for que percorrera todos os arquivos da pasta origin gerando copias das imagens na pasta fotos, mas convertendo as fotos para 648×486, já que este parece ser um tamanho adequado para fotos que devem viajar pela rede. Observe que o for utiliza a lista gerada pela expansão origin/*, e que no começo do arquivo devemos colocar a #!/bin/bash para indicar que este é um bash script.

#!/bin/bash
CONT=1;for FILE in origin/*; do
convert $FILE -resize 648x486
fotos/foto-$CONT.jpg
CONT=$[$CONT+1]
done

Observe que as fotos serao geradas com o nome foto-1.jpg foto-2.jpg … foto-10.jpg, de forma que se quisermos ter foto-0001.jpg, temos que gerar o texto atraves de uma função

function cont_to_var
{
AUX=$1
for NUM in 1000 100 10; do
if [ $AUX -lt $NUM ]; then
AUX=0$AUX;
fi
done
echo $AUX
}

Atribuimos isto a uma variavel utilizando os recursos do bash, para entao podermos gerar nossas imagens. Podemos aproveitar o loop e ja gerarmos as fotos e os snapshots 😀

VAR=$(cont_to_var $CONT)
convert $FILE -resize 648x486
fotos/foto-$VAR.jpg
convert $FILE -resize 140x105
snaps/snap-$VAR.jpg
CONT=$[$CONT+1]

Agora basta apenas inserir a parte do codigo que gera a pagina html. primeiramente, preparamos uma pagina com a base, e a pagina com o final do arquivo, e entao utilzamos o while para finalizar o processo. Notamos que ao final do for, temos $CONT carregando o numero de fotos +1. Utilizaremos então o while com a condição [ $CONT -le $MAX ] que equivale a dizer while (cont <= max), e para cada iteração iremos inserir o tag com a imagem, redirecionando a saida para nosso arquivo fotos.html

MAX=$CONT
CONT=1
PAGE=fotos.html
COL=5

cat base.html > $PAGE
while [ $CONT -lt $MAX ]; do
check_linha_start $CONT >> $PAGE
print_img $CONT >> $PAGE
CONT=$[$CONT+1]
check_linha_end $CONT >> $PAGE
done
cat tail.html >> $PAGE

Observe que hove um redirecionamento da saida do cat é feito utilizando os operadores > e >>, cuja a diferença é que > apaga o arquivo antes de escrever o novo dado. A função check_linha_start checa a nescessidade de se iniciar uma linha da tabela (que deve conter 5 colunas), enquanto check_linha_end checa a nescessidade de se finalizar a linha

function check_linha_start
{
I=$[$1-1]
if (( ! $[$I%$COL] )); then
echo "<tr>"
fi
}
function check_linha_end
{
I=$[$1-1]
if (( (! $[$I%$COL]) || ($1==$MAX) )); then
echo "echo "</tr>"
fi
}

Para imprimir a imagem, utilizamos a função print_img

function print_img
{
IMG=fotos/foto-$(cont_to_var $1).jpg
SNAP=snaps/snap-$(cont_to_var $1).jpg
echo "<td><a
href="$IMG" target="_BLANK">"
echo "<img src="$SNAP">"
echo "</a></td>"
}

Os arquivos base.html e tail.html apenas abrem e fecham os tags basicos do html, mas poder ser utilizado para gerar códigos mais complexos com css, etc 😀

<html>
<body>
<table>

Agora basta apenas rodar o script e ser feliz 😀

Se você quiser, voce pode baixar o meu script aqui

Sobre o autor

  • gustavo

    pow.. nao é mais facil usar o thumbs plus?! nao precisa ficar na linha de comando.. nada.. ou isso é pra mostrar q curte fazer as coisas do jeito mais complicado possível?!

  • Na verdade, este é apenas um exemplo do que se pode fazer com bash scripts (meio que um hello world :D) isso pode ser aplicado por exemplo a um conjunto de videos com mencoder, ou um conjunto de musicas com lame, ou ate mesmo extrair os links de uma pagina na web utilizando wget, crop ou sed

    Eu atualmente utilizo bash com Make, latex, gnuplot e lgrind para gerar minhas notas de aula de forma eficiente, não acredito que exista um programa tão especifico assim, então, conhecer bash ajuda bastante

    Tenho um amigo que utiliza as linhas de comando para economizar na compra de programas para mac
    http://www.liquuid.net/post/214/ 😀

    abraços 😀

  • Ele gosta de fazer as coisas pelo jeito mais dificil!! hahahahhahah

  • Hiro

    Eu lembro que eu gostava do DOS…

  • Nao confundir Bash com Batch (.bat) do Dos 😛