linux / shell: changer l'horodatage de modification d'un fichier relativement?

20

Mon appareil photo produit des fichiers comme IMG_1234.JPGet MVI_1234.AVIavec des horodatages sur ces fichiers. Malheureusement, l'heure n'a pas été réglée correctement et les horodatages sont désactivés.

Je voudrais définir l'horodatage du fichier sur le disque. (pas les données EXIF).

Algorithme proposé:

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

Y a-t-il un moyen facile de faire ceci? on pourrait peut-être simplifier le calcul en utilisant le temps d'époque (secondes depuis) ​​et concocter un script shell.

indice
la source
Le mot clé est mtime. Cependant, je n'ai pas encore trouvé de solution, car j'ai besoin d'un changement par rapport au mtime
index

Réponses:

38

touch peut le faire:

 $ 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

Pour modifier le mtime, ajoutez --time=mtime

rescdsk
la source
oui, mais ceci est relatif à l'heure actuelle de votre système, pas aux fichiers .. merci, cependant ..
index
1
Lorsque j'ai répondu pour la première fois, oui, mais j'ai modifié la réponse. Lorsque vous utilisez l' -r fileoption, elle devient relative à ce fichier. Donc, si vous avez le temps d'être relatif au même fichier que vous manipulez, vous obtenez ce que vous voulez.
rescdsk
Génial, merci. Exactement ce que je cherchais.
Artem Russakovskii
@rescdsk, juste par curiosité, comment ce changement aurait-il un impact sur l'analyse médico-légale du fichier? si vous avez modifié un fichier, mais que vous avez ensuite rétabli sa date de modification à la valeur précédente, est-ce que cela pourrait être détecté sur l'inode ou d'autres métadonnées du système de fichiers? la journalisation aurait-elle un impact sur cette analyse?
Frank Thomas
@FrankThomas, désolé, je n'ai aucune idée!
rescdsk
11

En combinant ce qui précède, si AM / PM était faux ...

Corrigez les horodatages des fichiers:

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

Mettez ensuite à jour les informations EXIF ​​dans les fichiers jpg vers l'horodatage corrigé:

$ jhead -dsft *.jpg

N'oubliez pas de régler l'heure sur votre appareil photo.

Cygne
la source
2

itère sur tous les fichiers du sous-répertoire all: utilisez stat pour obtenir l'heure des fichiers epoch / unix en secondes, laissez toucher analyser la somme comme nouvelle date pour mtime et écrire dans le fichier

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

pour une approche pythonienne, voir /programming/1158076/implement-touch-using-python

indice
la source
juste pour clarifier, cela signifie que l'analyseur de date de corutil n'accepte pas seulement les heures sémantiques relatives, mais peut réellement calculer! Je le fais juste remarquer car je n'ai pas trouvé ces informations dans la documentation ( gnu.org/software/coreutils/manual/… ) Les effets des éléments relatifs s'accumulent. "]
indice
2

Je fais la même chose sous OS X, et la syntaxe du toucher varie ici un peu.

J'utilise:

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

Cela ajustera + 1 heure 30 minutes 7 secondes par rapport à l'heure modifiée d'origine. '-013007'pour remonter le temps.

osbjmg
la source
Remarque: bien que meilleure que rien, cette syntaxe est un cauchemar pour les scripts.
tuomassalo
C'est exactement ce que je cherchais (trop paresseux pour RTFM: D). Merci!
Michele Dall'Agata
1

Linux, en utilisant le toucher pour changer le dernier horodatage modifié:

Créez un fichier avec l'horodatage de maintenant:

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

Modifiez l'horodatage il y a 2 heures:

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

Modifiez l'horodatage pour qu'il y ait 200 heures:

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

Modifiez l'horodatage pour qu'il y ait 30 jours:

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:~$

Pour les manigances, définissez la dernière date de modification à l'avenir:

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

Apparemment, nous allons faire la fête comme si c'était 3012 ce soir.

Eric Leschinski
la source
Pour le dernier exemple "futur", le signe moins ( -) n'indique-t-il pas que 400 000 jours se sont écoulés dans le passé , et pourtant cela se termine à l'avenir? Ou attendez, dites-vous que vous touchez pour doubler la date, moins + il y a = futur ...? Yar matey
Xen2050
0

Utilisez jhead:

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

Ajustez le temps stocké dans l'en-tête Exif de h: mm vers l'arrière ou vers l'avant. Utile lorsque vous avez pris des photos avec la mauvaise heure réglée sur l'appareil photo, par exemple après avoir traversé des fuseaux horaires, ou lorsque l'heure d'été a changé.

compie
la source
Merci pour l'astuce, c'est similaire à exif et exifTool et comme la fonction "Ajuster la date et l'heure" de digiKam - mais je voudrais modifier la date système du fichier. Un autre problème est que mon système d'exploitation intelligent semble convertir les heures en heures locales à la volée et que l'heure d'été est entrée dans un fuseau horaire :-)
index