Obrigado a Warren por me informar sobre o comando mediainfo
em sua resposta parcial.
Consegui construir um comando que conseguiu a restauração de timestamps. Ele percorre os arquivos aplicáveis e, para cada arquivo, mediainfo
lê os metadados, grep
e sed
selecionam e formatam o registro de data e hora, e touch
o aplica.
for file in *.mp4; do touch -t "$(mediainfo "$file" | grep -m 1 'Tagged date' | sed -r 's/.*([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2}).*/./')" "$file"; done
A parte de "selecionar e formatar" poderia, sem dúvida, ser muito mais curta / melhor; parece complicado para mim, mas eu não sou fluente com regexs. No entanto, o comando funcionou perfeitamente. Acho que citei tudo corretamente, então deve funcionar com qualquer nome de arquivo. Pode não funcionar se mediainfo
apresentar um formato diferente, mas é facilmente adaptável.
Por exemplo, aqui está uma regex que corresponde corretamente ao formato de saída dos meus arquivos *.mp4
, como UTC 2013-11-15 11:36:06
, e, adicionalmente, ao formato do exemplo de Warren de 2014-2-23T09:00:00Z
de my.mov
:
's/-/-0/g; s/.*([0-9]{4})-0?([0-9]{2})-0?([0-9]{2})[T ]([0-9]{2}):([0-9]{2}):([0-9]{2}).*/./'
E além de mediainfo
que eu tive que instalar manualmente devido a ele não estar nos repositórios da minha distro (embora pareça que os novos lançamentos agora o empacotam), ele deve ser razoavelmente portátil e útil para os outros se encontrarem um problema semelhante.
Nota: lembre-se de verificar os fusos horários. De acordo com as páginas GNU info
, touch
, date
e outros utilitários GNU usam a variável de ambiente TZ
se configuradas e as "regras padrão do sistema" caso contrário. Para ver o deslocamento do fuso horário que será usado, emita:
date +%:::z
Para alterá-lo, defina a variável de ambiente TZ
:
export TZ="UTC0"
Se os carimbos de data / hora do vídeo estiverem corretos e estiverem corretamente representados (ou seja, o valor de tempo para o fuso horário representar o ponto correto no tempo), certifique-se de que date +%:::z
produza o deslocamento correspondente para o fuso horário do timestamp antes de executar touch -t
sobre esses arquivos (como acima). Use stat
para verificar os arquivos, pois mostra o deslocamento de tempo (como date +%:::z
).