Renomeie as imagens para exif time: Crie nomes de arquivos exclusivos

4

Se eu renomear imagens via exiv para o horário exif, eu faço o seguinte:

find . -iname \*jpg -exec exiv2 -v -t -r '%Y_%m_%d__%H_%M_%S' rename {} \;

Agora, pode acontecer que as imagens tenham exatamente o mesmo timestamp (incluindo segundos). Como posso tornar o nome do arquivo exclusivo automaticamente?

O comando deve ser estável no sentido de que se eu o executar na mesma estrutura de diretórios novamente (talvez depois de adicionar novas imagens), as imagens já renomeadas não devem mudar e se imagens com nomes de arquivos já existentes forem adicionadas os novos nomes de arquivos deve ser único também.

Minha primeira tentativa foi deixar o nome de base original no nome do arquivo resultante, mas o comando não seria estável no sentido acima.

    
por student 01.10.2017 / 09:04

2 respostas

8

Você pode querer experimentar jhead em vez disso, o que é pronto para uso (com a , b ... z sufixos que permitem até 27 arquivos com a mesma data) e não possui o problema de estabilidade mencionado por @meuf:

find . -iname '*jpg' -exec jhead -n%Y_%m_%d__%H_%M_%S {} +

Ou usando exiftool (exemplo na man page):

exiftool -ext jpg '-FileName<CreateDate' -d %Y_%m_%d__%H_%M_%S%%-c.%%e .

(aqui com %-c sendo um sufixo numérico começando com - )

    
por 01.10.2017 / 13:19
3

Minha versão de exiv2 (0.25 001900) perguntará interativamente o que fazer quando o nome do arquivo já existir.

exiv2: File './2013_06_19__14_03_13.jpg' exists. [O]verwrite, [r]ename or [s]kip? 

Ao adicionar a opção -F , ele adicionará automaticamente um% extra_1 (ou _2 etc) ao nome.

Renaming file to ./2013_06_19__14_01_53_1.jpg, updating timestamp

Se o comando for executado uma segunda vez, ele diz:

This file already has the correct name

e não faz nada, mas fica confuso se houver a parte _1 e irá renomear _2 . Ele irá alternar assim de maneira não destrutiva em cada execução. Você pode ignorar isso, se desejar, ou alterar seu padrão find para ignorar arquivos que correspondam ao padrão de data com uma _ de peça.

Por exemplo, o padrão de expressão regular para o formato de data começa [0-9]{4}_[0-9]{2}_... . Para simplificar, procurarei apenas uma combinação de 20 caracteres do conjunto 0..9 e _ , que é regex [0-9_]{20} . Para isso, o sufixo de _ seguido por pelo menos 1 dígito para procurar é _[0-9]{1,}.jpg . Como a regex precisa corresponder ao caminho inteiro, e não apenas ao nome da base, a regex final, incluindo o diretório, é .*/[0-9_]{20}_[0-9]{1,}.jpg .

Então você pode usar um encontro como:

find . -regextype posix-extended ! -iregex '.*/[0-9_]{20}_[0-9]{1,}.jpg' -iname '*.jpg' ...
    
por 01.10.2017 / 12:11