Obtém fotos de uma Câmera Digital organizando em Subdiretórios e Renomeando

Publicado por Wagner Macêdo 15/09/2008

[ Hits: 6.217 ]

Download obter-fotos.sh




Esse é um script para obter fotos (e vídeos) de uma câmera e copiar renomeando pela hora da foto (ex: '2008-09-13_03,47,13.jpg') e guardando num subdiretório referente ao mês (ex: '2008-09 Setembro').

Foi feito de maneira que se possa integrar ao Gerenciador de Mídia do KDE3 (não testei no KDE4). Usa KDialog para interagir com o usuário.

Algumas considerações:
-A câmera deve poder funcionar como um disco externo.
-Tentei arrumar e comentar ao máximo o código.

  



Esconder código-fonte

#!/bin/bash

## Script que serve para obter fotos de uma câmera digital. É feito para se
## integrar ao Gerenciador de Mídia do KDE3 (não foi testado no KDE4).
## Para integrar entre em:
## 'Centro de Controle (kcontrol)' > 'Periféricos' > 'Mídia de Armazenamento'
##
## Códigos de saída (exit status code):
## 0 (sucesso) / 1 (erro) / 2 (cancelado)
##
## Autor: Wagner Luís de A. M. Macêdo (wagnerluis1982@gmail.com)

# Teste se há um parâmetro passado
if [ -z "$1" ]
then
   kdialog --title="Parâmetro faltando" --error   \
      "Não foi passado nenhum parâmetro!
      Exemplo: $0 media:/sdb1"
   exit 1
fi

# Variável para guardar o dispositivo
dispositivo=$1

# Montar o dispositivo
kio_media_mounthelper -m "$dispositivo"

# Essa funcão encontra o caminho real do ponto de montagem, passando como
# parâmetro uma URI do tipo kioslave
# $temp_realdir Arquivo temporário que guarda o retorno do comando
#    em formato hal
realdir() {
   temp_realdir="/tmp/realdir.temp"
   dcop kded mediamanager properties "$dispositivo" > "$temp_realdir"
   head -n 7 "$temp_realdir" | tail -n 1
}

# Funcao para desmontar o dispositivo e finalizar o script
# @$1 Status de saida (0-sucesso/1-erro)
# @$2 Dispositivo a desmontar
finaliza() {
   kio_media_mounthelper -s "$dispositivo"
   exit "$1"
}

# Variável recebe o caminho do ponto de montagem real
pontomontagem=`realdir "$dispositivo"`

# Testa se a URI passada retornou um ponto de montagem
if ! mountpoint -q "$pontomontagem"
then
   # Se o arquivo de retorno da função realdir() conter somente 1 linha,
   # então o parâmetro passado é inexistente ou incorreto
   if [ `wc -l "$temp_realdir"` = 1 ]
   then
      kdialog --title "Parâmetro incorreto" --error       \
         "Parâmetro incorreto
         Deve ser passado uma URI do tipo 'media:/sdb1'"
   else
      kdialog --title "Mídia não está montada" --error       \
         "Não foi possível encontrar um ponto de montagem para o   \
            $dispositivo
         Provavelmente houve algum erro ao montar"
   fi
   finaliza 1
fi

# Funcao para pesquisar por arquivos na mídia montada, pegar os meses pertencente a
# esses arquivos para criar os diretórios referente a cada mês (ex: 2008-09 Setembro)
# no destino especificado pelo usuário e copia as fotos renomeando no formato:
# '2008-09-13_22,13,51.ext'
#
# @$1 Diretório de destino
pesquisar_copiar() {
   # Todos os arquivos encontrados na mídia montada (que sejam fotos ou vídeos)
   temp_encontrados="/tmp/encontrados.temp"
   
   # Pesquisa por fotos e vídeos, redireciona a saída para um arquivo temporario
   find "$pontomontagem" -regextype posix-egrep -type f -iregex ".*.jpg$|.*.mpg$"   \
      -print0 > "$temp_encontrados"
   
   # Variável recebe parâmetro de diretório de destino
   dest=$1
   
   # Array para guardar os nomes dos meses, o primeiro valor está vazio
   # para que o mês comece do valor [1] e não precise somar 1 quando usar
   nome_meses=("" "Janeiro" "Fevereiro" "Março" "Abril" "Maio" "Junho"
      "Julho" "Agosto" "Setembro" "Outubro" "Novembro" "Dezembro")
   
   # Pegar tamanho total dos arquivos a copiar
   total=`du -c --files0-from="$temp_encontrados" | tail -n 1 | cut -f 1`
   
   # Usado para o diálogo de progresso
   dcopRef=`kdialog --title "Copiando" --progressbar "Copiando os arquivos para o diretório de destino. Aguarde!" $total`
   dcop $dcopRef showCancelButton true

   # Cria subdiretórios de acordo com o mês da foto e copia as fotos
   xargs -0 -a "$temp_encontrados" ls -b |   \
   while read arquivos
   do
      # Ação para quando o botão cancelar for pressionado
      if [ `dcop $dcopRef wasCancelled` = true ]
      then
         break
      fi
      
      # Pega a extensão original do arquivo
      extensao=`echo "$arquivos" | awk -F . '{print $NF}'`
      # Como será o nome do arquivo quando copiado
      nome_arquivo=`echo "$arquivos" | xargs -I "{}" stat -c %y "{}"   \
         | xargs -I "{}" date +%F_%H,%M,%S -d "{}"`
      # Pega o ano e mês. Ex: '2008-09'
      ano_mes=`echo $nome_arquivo | cut -d _ -f 1 | cut -d - -f "1 2"`
      # let 10# - Maneira de resolver o problema do shell interpretar
      #   os números resultantes do mês (01, 02,...) como octais,
      #   quando chegasse em 08, daria um erro.
      let mes=10#`echo $ano_mes | cut -d - -f 2`
      
      # Diretório de destino da foto dessa iteração do while
      copiar_para="$dest"/"$ano_mes ${nome_meses[$mes]}"
      # Se diretório não existir, cria um
      test -d "$copiar_para" || mkdir "$copiar_para"
      
      # Para onde a foto será copiada
      arquivo_dest="$copiar_para"/"$nome_arquivo"."$extensao"

      # Tamanho em bytes da foto dessa iteração
      tamanho=`du "$arquivos" | cut -f 1`
      
      # Copia a foto dessa iteração
      cp --preserve=timestamps "$arquivos" "$arquivo_dest"
      
      # Valor incrementado do tamanho da foto para subir a barra de progresso
      inc=$((`dcop $dcopRef progress` + $tamanho))
      # Define novo número para a barra de progresso
      dcop $dcopRef setProgress $inc
   done
   
   # Testa se o botão cancelar foi pressionado para retornar o código de saída correto
   if [ `dcop $dcopRef wasCancelled` = true ]
   then
      dcop $dcopRef close
      finaliza 2
   else
      dcop $dcopRef close
   fi
}

# Diálogo para escolher o diretório de destino
if ! destino=`kdialog --title "Escolha o diretório de destino" --getexistingdirectory ~/Fotos`
then
   # Se ao escolher o diretório de destino o usuário cancelar, o script finaliza
   kdialog --title "Cancelado" --msgbox "Cópia cancelada!"
   finaliza 2
else
   # Chamada da função pesquisar_copiar
   pesquisar_copiar "$destino"

   # Mensagem de sucesso
   kdialog --title "Sucesso" --msgbox   \
   "Suas fotos e/ou vídeos foram copiados com sucesso"
   finaliza 0
fi

Scripts recomendados

Atualizar status do MSN via shell script

Configuração pós instalação do Slackware

MGME - Mythic Game Master Emulator

Usar o Google Translate para ler (speak) a seleção

(Brincando com Aleatoriadade) Tarot Randomico


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts