quinta-feira, 4 de agosto de 2011

Numerando arquivos de forma cronológica


Desenvolvi este script para organizar a reunião de fotos de mais de uma máquina digital. Desta forma, independente como as câmera registram o nome de arquivo, as fotos são renomeadas de acordo com a sequência cronológica.
Primeiro, os nomes são renomeados para maiúsculas como foi no post Renomear de maiúscula para minúscula e com sequência numérica .

O comando ls -1 *.jpg trata de colunar todos os arquivos com essa extensão e a cada linha que avança, as variáveis ano, mes, dia, hora, mim, seg recebem seus respectivos valores e o comando tee -a faz duas tarefas:
  • exibe a saída na tela
  • armazena a saída no arquivo foto.txt
Como extrair a informação através do exiftool demanda processamento e dependendo da quantidade parece travado, exibir as mensagens mostra que o programa está executando. O passo seguinte é contar a quantidade de arquivos jpg e armazenar na variável total. Essa informação é usada no laço for para ser o critério de parada. Neste exemplo, fiz para mais de 100 fotos para que todos os nomes de arquivos fiquem com três dígitos (001.jpg, 002.jpg, .., 010.jpg, ..., 100.jpg, ...). Fica a seu critério a quantidade de dígitos. Caso opte por não preencher com 0s (zeros), use o exemplo sem dígitos.

#/bin/bash

for M in *.JPG
  do
    m=$(echo $M | tr A-Z a-z)
    mv -v $M $m
done

ls -1 *.jpg | {
  while read arq; do
    ano=`exiftool "$arq" | grep Original | sed 's/://g' | sed 's/ //g' | cut -c 18-21`
    mes=`exiftool "$arq" | grep Original | sed 's/://g' | sed 's/ //g' | cut -c 22-23`
    dia=`exiftool "$arq" | grep Original | sed 's/://g' | sed 's/ //g' | cut -c 24-25`
    hora=`exiftool "$arq" | grep Original | sed 's/://g' | sed 's/ //g' | cut -c 26-27`
    min=`exiftool "$arq" | grep Original | sed 's/://g' | sed 's/ //g' | cut -c 28-29`
    seg=`exiftool "$arq" | grep Original | sed 's/://g' | sed 's/ //g' | cut -c 30-31`
    echo "$arq" $ano$mes$dia$hora$min$seg
done
} | tee -a fotos.txt

cat fotos.txt | awk '{printf "%s %4s\n",$2,$1}' | sort -n > fotos2.txt

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

for i in `seq 9`
  do
    file=`head -n $i fotos2.txt | tail -n 1 | cut -f2 -d ' '`
    mv -v $file 00$i.jpg
  done

for i in `seq 10 1 99`
  do
    file=`head -n $i fotos2.txt | tail -n 1 | cut -f2 -d ' '`
    mv -v $file 0$i.jpg
  done

for i in `seq 100 1 $total`
  do
    file=`head -n $i fotos2.txt | tail -n 1 | cut -f2 -d ' '`
    mv -v $file $i.jpg
  done

Recomendo esta automatição de renomear arquivos de acordo com o data e hora quando várias pessoas participaram da mesma viagem, por exemplo. Assim, a visualização não será exibida em dias alternados. Para encerrar, dois cuidados:

  • Garantir a câmera de todos estejam com a data e hora correta. Não precisam estar sincronizadas, apenas corretas.
  • Difícil acontecer, mas caso exista um arquivo que até foi tirada no mesmo segundo, uma das fotos será sobreescrita.

Um comentário:

  1. Murilão!

    Ai um script que fiz também https://gist.github.com/665531

    Ai ele já busca em uma pasta todas fotos bagunçadas que jogamos e manda para outra uma cópia.

    ResponderExcluir