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

Publicado por Wagner Macêdo 15/09/2008

[ Hits: 6.223 ]

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

Avisar quando partição estiver 90% ocupada

Catsort - Concatenar resultado filtrando e removendo repetidas

restore.sh

Manipular serviços no Runit (Void Linux)

Script para desinstalação Gerix Wi-fi Cracker no Kali Linux


  

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