Obtém fotos de uma Câmera Digital organizando em Subdiretórios e Renomeando
Publicado por Wagner Macêdo 15/09/2008
[ Hits: 6.652 ]
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.
#!/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
verificar acessos indevidos automaticamente squid
GETPLAMIGA - Baixe a Palavra Amiga do Bispo Macedo
AutoLogin Slackware Current - Init 3
Script para adicionar chave pública
Backup simples com log de resultado
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
[Resolvido] VirtualBox can't enable the AMD-V extension
Como verificar a saúde dos discos no Linux
Como instalar , particionar, formatar e montar um HD adicional no Linux?
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Não consigo instalar distro antiga no virtualbox nem direto no hd (14)
Quais os códigos mais dificeis que vcs sabem fazer? (12)
systemd-resol... precisa ser reiniciado periodicamente [RESOLVIDO] (7)









