linux / shell: altera relativamente o timestamp de modificação de um arquivo?


20

Minha câmera produz arquivos como IMG_1234.JPGe MVI_1234.AVIcom registro de data e hora nesses arquivos. Infelizmente, a hora não foi definida corretamente e os carimbos de data e hora estão desativados.

Gostaria de definir o registro de data e hora do arquivo no disco. (não os dados EXIF).

Algoritmo proposto:

1 read file's modify date
2 add delta, i.e. hhmmss (preferred: change timezone)
3 write new timestamp

Existe uma maneira fácil de fazer isso? talvez alguém possa simplificar o cálculo usando o tempo da época (segundos desde) e criar um script de shell.


A palavra-chave é mtime. No entanto, ainda não encontrei uma solução, pois preciso de uma alteração em relação ao mtime do arquivo, não ao horário atual, conforme descrito em unixtutorial.org/2008/11//
index

Respostas:


38

touch posso fazer isso:

 $ ls -l something
-rw-rw-r-- 1 tgs tgs 0 2010-03-22 16:03 something
 $ touch -r something -d '-1 day' something 
 $ ls -l something 
-rw-rw-r-- 1 tgs tgs 0 2010-03-21 16:03 something

http://linux.about.com/library/cmd/blcmdl_touch.htm

Para alterar o mtime, adicione --time=mtime


sim, mas isso é relativo à hora atual do sistema, não ao arquivo .. obrigado, porém ..
index

11
Quando respondi pela primeira vez, sim, mas editei a resposta. Quando você usa a -r fileopção, ela se torna relativa a esse arquivo. Portanto, se você tiver um tempo relativo ao mesmo arquivo que está manipulando, conseguirá o que deseja.
rescdsk

Brilhante, obrigado. Exatamente o que eu estava procurando.
Artem Russakovskii

@rescdsk, apenas por curiosidade, como essa mudança afetaria uma análise forense do arquivo? se você modificou um arquivo, mas depois definiu sua data de modificação para o valor anterior, isso seria detectável no inode ou em outros metadados do sistema de arquivos? o diário impactaria essa análise?
Frank Thomas

@FrankThomas, desculpe, eu não tenho idéia!
rescdsk

11

Combinando o acima, se AM / PM estava errado ...

Corrija os carimbos de data / hora do arquivo:

#!/bin/sh
for i in all/*; do
  touch -r "$i" -d '-12 hour' "$i"
done

Atualize as informações EXIF ​​nos arquivos jpg para o carimbo de data e hora corrigido:

$ jhead -dsft *.jpg

Não se esqueça de fixar a configuração de tempo na sua câmera.


2

itera sobre todos os arquivos no subdiretório all: use stat para obter o tempo da época / unix dos arquivos em segundos, toque na análise da soma como nova data para o mtime e grave no arquivo

#!/bin/sh
for i in all/*; do
  touch -m -d "$(stat -c %y "$i") + 3600 sec" "$i"
done

para uma abordagem pythonian, consulte /programming/1158076/implement-touch-using-python


apenas para esclarecer, isso significa que o analisador de data do corutil não apenas aceita tempos semânticos relativos, mas também pode calcular! Apenas apontando como não encontrei essas informações na documentação ( gnu.org/software/coreutils/manual/… ) [Está realmente lá: "Itens relativos ajustam uma data (ou a data atual, se não houver) para frente ou para trás. Os efeitos de itens relativos se acumulam. "]
index

2

Estou fazendo a mesma coisa no OS X, e a sintaxe do toque varia um pouco aqui.

Estou usando:

touch -r "filename" -A '013007' "filename"

Isso ajustará + 1 hora e 30min 7seg em relação ao tempo original modificado. '-013007'por voltar o tempo.


Uma observação lateral: embora melhor do que nada, essa sintaxe é um pesadelo para scripts.
precisa saber é o seguinte

Era exatamente isso que eu estava procurando (com preguiça de RTFM: D). Obrigado!
Michele Dall'Agata

1

Linux, usando o touch para alterar o carimbo de data / hora da última modificação:

Crie um arquivo com registro de data e hora agora:

el@apollo:~$ touch myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Aug 22 09:25 myfile.txt

Altere o carimbo de data e hora para 2 horas atrás:

el@apollo:~$ touch -d "2 hours ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Aug 22 07:25 myfile.txt

Altere o carimbo de data e hora para 200 horas atrás:

el@apollo:~$ touch -d "200 hours ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Aug 14 01:25 myfile.txt

Altere o carimbo de data e hora para 30 dias atrás:

el@apollo:~$ touch -d "30 days ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Jul 23 09:25 myfile.txt
el@apollo:~$

Para travessuras, defina a data da última modificação no futuro:

el@apollo:~$ touch -d "-400000 days ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Oct 21  3012 myfile.txt

Aparentemente, vamos festejar como se fosse 3012 hoje à noite.


Para o último exemplo "futuro", o -sinal de menos ( ) não diz ao toque para passar 400.000 dias no passado e, no entanto, acaba no futuro? Ou espere, você está dizendo para tocar duas vezes para negar a data, menos + atrás = futuro ...? Yar amigo
Xen2050

0

Use jhead:

http://www.sentex.net/~mwandel/jhead/usage.html

Ajuste o tempo armazenado no cabeçalho Exif em h: mm para trás ou para frente. Útil ao tirar fotos com o horário errado definido na câmera, como depois de viajar por fusos horários ou quando o horário de verão mudou.


Obrigado pela dica, isso é semelhante ao exif e exifTool e como o recurso "Adjust Date and Time" do digiKam - mas eu gostaria de modificar a data do sistema do arquivo. Outro problema é que meu sistema operacional inteligente parece converter horários para o horário local em tempo real e o horário de verão entrou em um fuso horário :-)
index
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.