domingo, 31 de julho de 2011

Convertendo as fotos de um diretório específico


Olá!
Este post mostra como redimensionar fotos. Por exemplo, se as fotos forem uma matriz 3072x2304, o script reduzirá para 1/4 deste tamanho tornando 768x576.
Deve ser executado nos mesmo diretório que estão as fotos. Neste momento a variável dirorig (diretório de origem) armazena o comando pwd mantendo intacto os arquivos. Deve-se criar o diretório menor um nível abaixo do diretório onde estão as fotos para dar um destino às fotos tratadas (variável dirtrat). Para obter o tamanho de cada arquivo é necessário usar a saída do awk para obter o terceiro campo como entrada do sed para extrair os números no meio de outros caracteres.
Uma diferença com relação ao post anterior é a forma de selecionar os arquivos. No anterior, é usado um for porque é necessário incrementar um contador. O critério de seleção é um ls e um while executa enquanto encontrar o tipo selecionado. Desta forma, para cada arquivo que entra na seleção, executa a ação de redimensionar.


#!/bin/bash

##### Configuracao ####
# diretorio de origem
dirorig="$PWD"
# Entre com o diretorio onde ficarao as fotos tratadas
dirtrat="$PWD/menor"

mkdir "$dirtrat"

ls -1 *.jpg | {
  while read arq
    do
      l=`identify "$arq" | awk '{printf "%s\n",$3}' | sed 's/x/ /' | awk '{printf "%s\n",$1}'`
      c=`identify "$arq" | awk '{printf "%s\n",$3}' | sed 's/x/ /' | awk '{printf "%s\n",$2}'`
      width=`echo $l/4 | bc`        # 1/4 do comprimento
      height=`echo $c/4 | bc`       # 1/4 da altura
  echo linha=$width coluna=$height "$arq"

  if [ "$width" -gt "$height" ]
    then
      convert -resize "$witdh"x"$height" "$arq" "$dirtrat"/"$arq"
      echo "$witdh"x"$height"
    else
      convert -resize "$height"x"$witdh" "$arq" "$dirtrat"/"$arq"
      echo "$height"x"$witdh"
  fi
done
}


Um exemplo de aplicação deste script é fazer com que os anexos dos e-mail sejam bem mais leves. Ou mesmo quando for criar uma página na web, seu carregamento será bem mais rápido do que se for usar a do tamanho original.

sábado, 30 de julho de 2011

Renomear de maiúscula para minúscula e com sequência numérica

  Bem-vindos!
  Há um certo tempo que estudo Shell Script do GNU/Linux e agora passo a publicar meus códigos-fontes com a intenção de incentivar as pessoas a resolverem seus problemas programando. Um outro propósito é reunir pessoas que também programam para que todos se beneficiem ganhando novas técnicas de programação.

  Neste primeiro post eu mostro como modificar arquivos atendendo a um critério. Por exemplo, suponha um diretório que tenham uma diversidade de arquivos misturados. Vamos fazer as seguintes alterações:
1. Mudar de letras maiúsculas para minúsculas;
2. Alterar o nome de arquivos usando uma sequência numérica.

  Para resolver o item 1, temos:
for M in *.JPG
  do
     m=$(echo $M | tr A-Z a-z)
     mv -v $M $m
  done 

  Para a problema 2, o formato que os nomes de arquivos terão contem sempre 2 dígitos. Por exemplo: 01.jpg, 02.jpg, ..., 10.jpg, 99. jpg.

#!/bin/bash

declare -i i=1
declare -i qtde
qtde=`ls *.jpg | wc -l`

for i in `seq 9`
  do
    mv -v `ls -1 *.jpg | head -n $i | tail -n 1` 0$i.jpg
  done

for i in `seq 10 1 "$qtde"`
  do
    mv -v `ls -1 *.jpg | head -n $i | tail -n 1` $i.jpg 
  done
 


  Caso deseje que seja 1.jpg, 2.jpg, ..., 10.jpg, ou seja, sem o número 0 (zero) à esquerda, o código pode ser enxugado para este abaixo:

#!/bin/bash

declare -i i=1
declare -i qtde

qtde=`ls *.jpg | wc -l`
for i in `seq "$qtde"`
  do
    mv -v `ls -1 *.jpg | head -n $i | tail -n 1` $i.jpg
  done

  As câmeras digitais armazenam os nomes de arquivos com letras maiúsculas. Portanto, caso queira manter a extensão JPG (maiúsculas), troque a linha

qtde=`ls *.jpg | wc -l`


por


qtde=`ls *.JPG | wc -l`

para que o sistema operacional faça a contagem correta.

  O exemplo apresentado tratou da extensão jpg. Modifique de acordo com as suas necessidades tornando aplicável à outras extensões ou mesmo o nome do arquivo.


  Espero que possa ser útil para organizar seus arquivos pessoais e profissionais.

Murilo Fujita
murilofujita@gmail.com