Como renomear várias fotos e vídeos com base em dados EXIF?

8

Muitas vezes, importo fotos e vídeos (principalmente com extensões JPG e MOV) de câmeras digitais e tablets para o meu PC, e eu gostaria de vê-los classificados de acordo para as datas e horas em que foram tiradas já presentes nos dados EXIF. E, portanto, meu desejo de renomeá-los todos preferencialmente usando um simples Nautilus Script , preferencialmente inserindo os carimbos de data e hora antes de cada nome de arquivo.

Até agora consegui apenas reunir o seguinte Nautilus Script, que acredito estar longe de ser perfeito:

for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i"" 
done

O que eu não gosto neste método de renomeação são os pontos-e-vírgulas usados em data e hora EXIF (por exemplo, "2013: 09: 03 20: 55: 09_IMG_0108.JPG") que podem criar problemas ao transferir esses arquivos posteriormente para outros ambientes (por exemplo, Windows).

Este comando (usando exiv2 ao invés de exiftool ) permite convenientemente a manipulação de data e hora, mas sua desvantagem é que não funciona em vídeo ( por exemplo, arquivos MOV) :

exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"

Então, espero que alguém possa encontrar uma solução melhor. E seria mágico se ele conseguisse converter os nomes de arquivos e extensões originais em minúsculas também!

    
por Sadi 16.09.2013 / 00:19

4 respostas

6

What I don't like in this renaming method is the colons used in EXIF date and time stamps (e.g. "2013:09:03 20:55:09_IMG_0108.JPG") which might create problems when transferring these files later to other environments (e.g. Windows).

Você pode executar o esquema de nomenclatura por meio de sed , para substituir os dois-pontos por traços e espaços com sublinhados, da seguinte forma:

mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"

Quanto a tornar a coisa toda minúscula, você pode usar rename :

rename 's/(.*)/\L$1/' file.JPG
##  or
rename 's/(.*)/\L$1/' *.*

Ou você pode fazer isso em seu script usando sed , como em:

j=$(echo "$i" | sed -e 's/\(.*\)/\L/')

... e, em seguida, use a variável $j no lugar da% final$i da sua linha mv . Este modo sed é um pouco mais portátil (se isso é importante para você), já que diferentes distribuições de Linux têm diferentes comandos de renomeação, enquanto o sed é universal.

Ou, como alternativa, o script pode ser modificado da seguinte forma para realizar a conversão de nomes de arquivo em letras minúsculas no início usando tr :

for arg 
do
  tmp="$(echo "$arg" | tr '[A-Z]' '[a-z]')"
  mv -i "$arg" "$(exiftool -CreateDate "$arg" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done

Para executar comandos ligeiramente diferentes para diferentes tipos de arquivo, uma instrução de caso bash pode ser usada neste script. Por exemplo:

#! /usr/bin/env bash
for filename in ./*
do
  tmp="$(echo "$filename" | tr '[A-Z]' '[a-z]')"
  case "$filename" in
    *.MOV|*.mov) 
      mv -i "$filename" "$(exiftool -a -s -CreateDate-tur "$filename" | awk -F ': ' '{print $2}' | sed -e 's/\-[0-9][0-9]\:00//g' -e 's/\+[0-9][0-9]\:00//g' -e 's/:/-/g' -e 's/ /_/g')_$tmp"
      ;;
    *.JPG|*.jpg)
      mv -i "$filename" "$(exiftool -a -s -CreateDate "$filename" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp""
      ;;
    *)
      echo 'Not a *.jpg or a *.mov!'
      ;;
  esac
done

Neste exemplo, a renomeação de arquivos MOV que possuem carimbos de data e hora CreateDate QUALQUER NÚMERO de horas APÓS OU ANTES de arquivos JPG é ajustada usando outros dados EXIF (-tur) e removendo esse sufixo de diferença de horário, e pode ser necessário alterar a parte -tur de acordo com a localização definida no sistema.

    
por evilsoup 16.09.2013 / 01:00
10

Eu precisava renomear minhas fotos e encontrei essa pergunta aqui. Acabei de descobrir que exiftool manipula nativamente:

De link

exiftool -d %Y-%m-%d_%H-%M-%S%%-c.%%e "-filename<CreateDate" DIR 

Se você deseja acompanhar o nome do arquivo original e gravar minúsculas:

exiftool -d %Y%m%d_%H%M%S%%-c-%%f.%%le "-filename<DateTimeOriginal" [.|DIR]

O mesmo funciona também com o nome do arquivo inteiro em letras minúsculas:

exiftool -d %Y%m%d_%H%M%S%%-c-%%lf.%%le "-filename<DateTimeOriginal" [.|DIR]
    
por DerekC 23.12.2014 / 16:24
1

Eu usaria krename para isso.

  • mostra a visualização ao vivo
  • permite desfazer
  • pode ir recursivamente para dir
  • permite vários padrões de renomeação
  • permite globs e regexps em padrões
  • lembra-se da história
por Adobe 16.09.2013 / 11:54
1

Eu sei que você disse que prefere um script, no entanto, se você estiver aberto a um aplicativo Java gratuito, poderá usar AmoK Exif Sorter

    
por opticyclic 25.06.2014 / 17:21