Script pra baixar fotos em formato AAAA-MM-DD

Iniciado por Éderson, 20 de Maio de 2010, 23:33

tópico anterior - próximo tópico

Éderson

O que o script faz:
* Detecta sua câmera fotográfica
* Baixa as fotos (e vídeos) renomeando-as colocando a data em que foi tirada em formato AAAA-MM-DD, antes do nome original da foto. (ex: de IMG0001.jpg para 2010-05-20_IMG0001.jpg)
* Copia as fotos para a pasta ~/Imagens/Fotos/ANO/DATA (ex: ~/Imagens/Fotos/2010/2010-05-20/)

Nome do arquivo que coloquei: Importar_fotos_modo_texto.sh

#! /bin/bash
# MANUAL
# http://www.gphoto.org/doc/manual/ref-gphoto2-cli.html
# http://www.scribd.com/doc/7234284/Gphoto-e-Gtkam (MUITO BOM E EM PORTUGUÊS)
# http://linux.die.net/man/1/gphoto2
# http://linux.die.net/man/1/date (FORMATO DE DATAS)

# EXEMPLOS
# http://www.gphoto.org/doc/manual/using-gphoto2.html
# http://www.leenooks.com/page/show/iRiver%20T10
# http://www.nkuttler.de/2009/10/04/canon-powershot-a60-on-debian/

###############################################################################
# inicio do programa
#
clear;
if ! [ -f "/usr/bin/gphoto2" ] ; then
   zenity --title="Ops !" \
          --info --text "Infelizmente não encontrei o programa /usr/bin/gphoto2 que é necessário para a execução deste script.

Para instalá-lo o comando é:
gksu aptitude install -y gphoto2"
  exit 2;
fi

###############################################################################
WindowTitle="Copiando arquivos"
MessageProgress="Por favor espere um pouco enquanto as suas fotos são copiadas para os anos em que foram tiradas."
MessageProgressTitle="Copiando arquivos"
filedate=`date +%Y-%m-%d`
mkdir -p ~/Imagens/Fotos/Importadas_em_$filedate
cd ~/Imagens/Fotos/Importadas_em_$filedate
gvfs-mount -s gphoto2
sleep 2
#xterm -T "Detectando a câmera" -e "gphoto2 --auto-detect && read -t 4" &
notify-send -t 2 "Detectando a câmera e baixando as fotos" & "gphoto2 --auto-detect && read -t 4" &
sleep 2
xterm -T "Importando arquivos da câmera" -e "gphoto2 --get-all-files --filename %Y-%m-%d_%f.%C && read -t 4"
# SEM HORA DA FOTO: %Y-%m-%d_%f.%C
# COM HORA DA FOTO: %Y-%m-%d-%H%M%S_%f.%C

###############################################################################
# Renomeia e move ./File.$2 para YYYY/YYYY-MM-DD_NOME_DA_IMAGEM.$2
# Com $1 como nome do arquivo (jpg ou avi ou mp3 ou qualquer coisa que contenha data inserida como uma tag exif)
# Este processo é um pouco lento!

function MoveWhatever {
if [ $# -ne 1 ]; then exit; fi

# Extrai a data do arquivo. Isso pode não funcionar em alguns tipos de arquivos
DateStr=$( strings -14 "$1" | egrep -m 1 "^20[0-9][0-9][ :/]?[0-9][0-9][ :/]?[0-9][0-9][ :/]?[0-9][0-9][ :/]?[0-9][0-9][ :/]?[0-9][0-9]" ) &&
ANO=$( echo "$DateStr" | sed -e "s/\(20[0-9][0-9]\).*/\1/" ) &&
Date=$( echo "$DateStr" | sed -e "s/\(20[0-9][0-9]\)[ :/]*\([0-9][0-9]\)[ :/]*\([0-9][0-9]\).*/\1\-\2\-\3/" ) &&
Time=$( echo "$DateStr" | sed -e "s/20[0-9][0-9][ :/]*[0-9][0-9][ :/]*[0-9][0-9][ :/]*\([0-9][0-9]\)[ :/]*\([0-9][0-9]\)[ :/]*\([0-9][0-9]\).*/\1\2\3/" ) &&

# Cria a pasta se necessário
mkdir -vp "$ANO/$Date" &&
# caso deseje o comando acima pode ser trocado para: mkdir -vp $Date &&
# Move e renomeia o arquivo somente se os passos acima obtiveram sucesso
mv -iv "$1" "$ANO/$Date"
# caso deseje o comando acima pode ser trocado para: mv -iv "$1" "$Date"
}
export -f MoveWhatever
 
###############################################################################
# Renomeando de acordo com a data date
# Nomes originais são modificados (mas quem se importa?)

echo
echo "Renaming and moving files to final destination:"
# e outras extensões como necessitado
find -maxdepth 1 -iregex ".*\.\(jpg\|tif\|wav\|mp3\|avi\|mpg\|raf\|raw\|dng\|nef\)" -exec bash -c "MoveWhatever '{}'" \;

echo
echo "Verify that the files have been properly moved and reformat your memory card."
echo "If there are jpg or raw files left in the present directory, run this script again."
###############################################################################
# Copiar os vídeos para o ano em que foram tirados

for n in *
do
    if [ ${#n} -lt 3 ]
    then
        mv $n
    else
        ANO_VIDEO=${n:0:1}${n:1:1}${n:2:1}${n:3:1}
        DATA_VIDEO=${n:0:1}${n:1:1}${n:2:1}${n:3:1}-${n:5:1}${n:6:1}-${n:8:1}${n:9:1}
# Copiar os vídeos para a pasta do ano.
# Ex: 2009-01-31_0001.AVI será copiado para a pasta: ~/Imagens/2009
        mkdir -p ~/Imagens/Fotos/Importadas_em_$filedate/$ANO_VIDEO
        mv $n ~/Imagens/Fotos/Importadas_em_$filedate/$ANO_VIDEO
# Se preferir que os vídeos sejam copiados para uma pasta com a data, comente as linhas (com mkdir e mv) acima e descomente as linhas (com mkdir e mv) abaixo.
# Para comentar uma linha, coloque # antes do início dela e para descomentar retire o #
# Ex: 2009-01-31_0001.AVI será copiado para a pasta: ~/Imagens/2009/2009-01-31
        #mkdir -p ~/Imagens/Fotos/Importadas_em_$filedate/$ANO_VIDEO/$DATA_VIDEO
        #mv $n ~/Imagens/Fotos/Importadas_em_$filedate/$ANO_VIDEO/$DATA_VIDEO
    fi
done

# Se algo der errado acima este comando entra em ação ou então copia arquivos não datados para que não sejam perdidos
mkdir -p ~/Imagens/Fotos/Importadas_em_$filedate/Outros
find -maxdepth 1 \( -name \*.* \) -exec mv {} ~/Imagens/Fotos/Importadas_em_$filedate/Outros \;
#find -maxdepth 1 \( -name \*.avi -o -name \*.AVI \) -exec mv {} ~/Imagens/Fotos/Importadas_em_$filedate/Outros \;

#mv -u ~/Imagens/Fotos/Importadas_em_$filedate/* ~/Imagens/Fotos/
cp -r ~/Imagens/Fotos/Importadas_em_$filedate/* ~/Imagens/Fotos/
sleep 1
rm -r ~/Imagens/Fotos/Importadas_em_$filedate/
###############################################################################
sleep 1
wait
#xterm -T "Lista dos arquivos importados" -e "gphoto2 --list-files && read -t 3" &
wait
zenity --title="FIM" \
       --info --text "Importação de arquivos terminada.

Os arquivos estão em sua pasta /Imagens/Fotos"


O que queria implementar mas não sei como:

1 - Se não for detectada uma câmera, exibir um aviso de que a câmera não foi detectada.

2 - No final do arquivo onde tem a linha: cp -r ~/Imagens/Fotos/Importadas_em_$filedate/* ~/Imagens/Fotos/
deveria ser: mv -u ~/Imagens/Fotos/Importadas_em_$filedate/* ~/Imagens/Fotos/
O problema é que funciona bem na primeira importação mas depois que já houver o ano criado, não consegue mais transferir as fotos para a pasta desejada.