linux / shell: ¿cambiar la marca de tiempo de modificación de un archivo relativamente?

20

Mi cámara produce archivos como IMG_1234.JPGy MVI_1234.AVIcon marcas de tiempo en esos archivos. Lamentablemente, el tiempo no se configuró correctamente y las marcas de tiempo están desactivadas.

Me gustaría configurar la marca de tiempo del archivo en el disco. (no los datos EXIF).

Algoritmo propuesto:

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

¿Hay una forma fácil de hacer esto? tal vez uno podría simplificar el cálculo utilizando el tiempo de época (segundos desde entonces) y crear un script de shell.

índice
fuente
La palabra clave es mtime. Sin embargo, todavía no he encontrado una solución, ya que necesito un cambio en relación con el tiempo m
índice

Respuestas:

38

touch puede hacer esto:

 $ 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 cambiar el mtime, agregue --time=mtime

rescdsk
fuente
sí, pero esto es relativo a la hora actual de su sistema, no al archivo ... gracias, aunque ...
index
1
Cuando respondí por primera vez, sí, pero edité la respuesta. Cuando usa la -r fileopción, se vuelve relativa a ese archivo. Entonces, si tiene el tiempo para estar relacionado con el mismo archivo que está manipulando, obtendrá lo que desea.
Rescdsk
Genial, gracias. Exactamente lo que he estado buscando.
Artem Russakovskii
@rescdsk, solo por curiosidad, ¿cómo afectaría este cambio a un análisis forense del archivo? si modificó un archivo, pero luego restableció su fecha de modificación al valor anterior, ¿sería detectable en el inodo u otros metadatos del sistema de archivos? ¿afectaría el diario este análisis?
Frank Thomas
@ FrankThomas, lo siento, no tengo ni idea!
rescdsk
11

Combinando lo anterior, si AM / PM estaba equivocado ...

Corrija las marcas de tiempo del archivo:

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

Luego actualice la información EXIF ​​en los archivos jpg a la marca de tiempo corregida:

$ jhead -dsft *.jpg

No olvides fijar la hora en tu cámara.

Cisne
fuente
2

itera sobre todos los archivos en el subdirectorio todos: use stat para obtener el tiempo de epoch / unix de los archivos en segundos, deje que toque analizar la suma como nueva fecha para mtime y escriba en el archivo

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

para un enfoque pitoniano ver /programming/1158076/implement-touch-using-python

índice
fuente
solo para aclarar, esto significa que el analizador de fechas de corutil no solo acepta tiempos semánticos relativos, sino que en realidad puede calcular Solo lo señalé, ya que no encontré esa información en la documentación ( gnu.org/software/coreutils/manual/… ) [En realidad está ahí: "Los elementos relativos ajustan una fecha (o la fecha actual si no hay) hacia adelante o hacia atrás. Los efectos de los elementos relativos se acumulan. "]
índice
2

Estoy haciendo lo mismo en OS X, y la sintaxis del tacto varía aquí un poco.

Estoy usando:

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

Esto ajustará + 1 hora 30 minutos 7 segundos en relación con el tiempo modificado original. '-013007'por volver el tiempo atrás.

osbjmg
fuente
Una nota al margen: aunque es mejor que nada, esta sintaxis es una pesadilla para los scripts.
tuomassalo
Eso es exactamente lo que estaba buscando (demasiado vago para RTFM: D). ¡Gracias!
Michele Dall'Agata
1

Linux, usando la función táctil para cambiar la última marca de tiempo modificada:

Cree un archivo con marca de tiempo de ahora:

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

Cambie la marca de tiempo para que sea hace 2 horas:

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

Cambie la marca de tiempo para que sea hace 200 horas:

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

Cambie la marca de tiempo para que sea hace 30 días:

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 travesuras, establezca la última fecha de modificación en el 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 a festejar como si fuera 3012 esta noche.

Eric Leschinski
fuente
Para el último ejemplo de "futuro", ¿el signo menos ( -) le dice a touch que se vaya 400,000 días en el pasado y, sin embargo, termina en el futuro? O espere, ¿le dice a touch que doble la fecha, menos + ago = futuro ...? Yar
matey
0

Use jhead:

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

Ajuste el tiempo almacenado en el encabezado Exif por h: mm hacia atrás o hacia adelante. Es útil cuando ha tomado fotos con la hora incorrecta configurada en la cámara, como después de viajar a través de zonas horarias, o cuando ha cambiado el horario de verano.

compie
fuente
Gracias por el consejo, es similar a exif y exifTool y le gusta la función "Ajustar fecha y hora" de digiKam, pero me gustaría modificar la fecha del sistema del archivo. Otro problema es que mi sistema operativo inteligente parece convertir las horas a la hora local sobre la marcha y el horario de verano se activó en una zona horaria :-)
índice