Renomear imagens para tempo exif: crie nomes de arquivos exclusivos

11

Se eu renomear imagens via exiv para a data e hora exif, faça o seguinte:

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

Agora, pode acontecer que as fotos tenham exatamente o mesmo carimbo de data / hora (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ório novamente (talvez após adicionar novas imagens), as imagens já renomeadas não deverão mudar e se forem adicionadas imagens com nomes de arquivos já existentes, os novos nomes de arquivos deverão ser exclusivos também.

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

aluna
fonte
1
Extraia o registro de data e hora, construa o nome do arquivo, verifique o nome do arquivo existente, modifique (adicione sufixo ou similar), se houver, e mvo arquivo.
Kusalananda
Existe também uma maneira mais direta, adicionando uma opção ao comando exiv2?
estudante de
Portanto, a resposta usando exiftool seria algo como: exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .. Talvez você possa transformar seu comentário em uma resposta.
student

Respostas:

17

Você pode querer experimentar jheadem vez que faz isso out-of-the-box (com a, b... zsufixos permitindo que até 27 arquivos com a mesma data) e não tem o problema de estabilidade mencionado por @meuh:

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

Ou usando exiftool(exemplo na página do manual):

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

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

Stéphane Chazelas
fonte
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, -Fele adicionará automaticamente um extra _1(ou _2etc) 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 _1peça e a renomeia _2. Alternará assim de maneira não destrutiva a cada execução. Você pode ignorar isso, se quiser, ou alterar seu findpadrão para ignorar arquivos que correspondem ao padrão de data com uma _parte.

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

Então você pode usar um achado como:

find . -regextype posix-extended ! -iregex '.*/[0-9_]{20}_[0-9]{1,}.jpg' -iname '*.jpg' ...
meuh
fonte
1

Exiv2 pode lidar com isso por conta própria. Também passei muito tempo procurando ajuda nisso, até ver o manual exiv2. A opção -F resolve esse problema.

exiv2 -r'%Y_%m_%d__%H_%M_%S' -F *.jpg

Anexará um _N no final, se o arquivo já existir.

E para aqueles que procuram uma opção que permita criar pasta.

exiftool -r '-FileName<DateTimeOriginal' -d %Y/%m/%d/%%f%%-c.%%e *
J.Adler
fonte
0

O pyrenamer não funcionará no meu novo Ubuntu 16.04 instalado; portanto, também tenho que encontrar outra maneira de resolver esse problema.

Eu tenho arquivos como IMG_0001.JPG, IMG_0002.JPG, ... em uma pasta. Verifique este site, /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

Instale o "exiv2" primeiro e escrevi a seguinte linha de comando:

para img em $ (ls *. [Jj] [Pp] [Gg] 2> / dev / null); exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})" renomeie "$ img"; feito

Os nomes dos arquivos de saída são AAAAMMDD_HHMMSS_0001.JPG, AAAAMMDD_HHMMSS_0002.JPG, ... etc. Até as fotos foram tiradas no mesmo segundo, o número de série da foto original fará a diferença.

chuck lee
fonte