Comment puis-je changer la date de modification / création d'un fichier?


234

Existe-t-il un moyen de modifier la date de création / modification d'un fichier (indiquée dans Nautilus ou à l'aide de la commande ls -l)? Idéalement, je recherche une commande capable de modifier les horodatages de tout un groupe de fichiers à une certaine heure plus tôt ou plus tard (par exemple, +8 heures ou -4 jours, etc.).

Réponses:


324

Tant que vous êtes le propriétaire du fichier (ou de la racine), vous pouvez modifier l'heure de modification d'un fichier à l'aide de la touchcommande suivante:

touch filename

Par défaut, l'heure de modification du fichier est définie sur l'heure actuelle, mais il existe un certain nombre d'indicateurs, tels que l' -dindicateur permettant de choisir une date particulière. Ainsi, par exemple, pour définir un fichier comme étant modifié deux heures avant le présent, vous pouvez utiliser les éléments suivants:

touch -d "2 hours ago" filename

Si vous souhaitez plutôt modifier le fichier par rapport à son heure de modification existante, procédez comme suit:

touch -d "$(date -R -r filename) - 2 hours" filename

Si vous souhaitez modifier un grand nombre de fichiers, vous pouvez utiliser les éléments suivants:

find DIRECTORY -print | while read filename; do
    # do whatever you want with the file
    touch -d "$(date -R -r "$filename") - 2 hours" "$filename"
done

Vous pouvez modifier les arguments pour findne sélectionner que les fichiers qui vous intéressent. Si vous souhaitez uniquement mettre à jour les temps de modification des fichiers par rapport à l'heure actuelle, vous pouvez le simplifier pour:

find DIRECTORY -exec touch -d "2 hours ago" {} +

Ce formulaire n'est pas possible avec la version relative du fichier, car il utilise le shell pour former les arguments touch.

En ce qui concerne le moment de la création, la plupart des systèmes de fichiers Linux ne gardent pas trace de cette valeur. Il y a un ctimeassocié à des fichiers, mais il trace quand les métadonnées du fichier ont été modifiées pour la dernière fois. Si les autorisations du fichier ne sont jamais modifiées, il peut arriver que la création soit conservée, mais il s’agit d’une coïncidence. Changer explicitement le temps de modification du fichier compte comme un changement de métadonnées, aura donc également pour effet secondaire de mettre à jour le fichier ctime.


Pour mentionner le cas plus simple lorsque tous les fichiers sont dans le même dossier:, touch -d "2 hours ago" /path/*.txtpar exemple.
enzotib

1
J'ajouterais également que changer le ctimen'est pas possible de manière standard.
organiser

Est-ce tout POSIX?
user1011471

1
Les informations sur l' ctimeheure de changement des métadonnées proviennent de POSIX. Je ne sais pas si les fragments de shell de ma réponse fonctionneraient avec des utilitaires de shell POSIX stricts. Mais ils travaillent certainement sur Ubuntu, qui est le contexte des réponses sur ce site.
James Henstridge

1
Sous OSX, vous pouvez utiliser gtouchvia brew install coreutils.
Nobu

46

Merci pour l'aide. Cela a fonctionné pour moi:

Dans le terminal, accédez au répertoire pour la modification de la date. Puis tapez:

find -print | while read filename; do
    # do whatever you want with the file
    touch -t 201203101513 "$filename"
done

Vous verrez un ">" après avoir appuyé sur enter, sauf pour la dernière fois -> "done".

Remarque: Vous voudrez peut-être changer "201203101513"

"201203101513" = est la date souhaitée pour tous les fichiers de ce répertoire.

Voir ma page web


cela ne fonctionne pas comme prévu si un nom de fichier contient des espaces
Angel

La page Web n'est plus, bien que ce soit 6 ans plus tard. Néanmoins, c'est la réponse que je cherchais. Pour ceux qui souhaitent inclure des secondes dans leur temps, utilisez .ssss est le nombre de secondes. (Remarque: cela ne semble pas contrôler les minutages inférieurs à la seconde, tels que les nanosecondes ou les millisecondes, qui pour moi ne sont apparus que comme des zéros; cependant, cette différence était permise pour mon cas d'utilisation.)
Spencer D

34

Le moyen le plus simple - accéder et modifier sera le même:

touch -a -m -t 201512180130.09 fileName.ext

Où:

-a = accessed
-m = modified
-t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format

Si vous souhaitez utiliser, NOWsupprimez simplement -tl'horodatage.

Pour vérifier qu'ils sont tous les mêmes: stat fileName.ext

Voir: touch man


1
J'ai essayé de le vérifier à l'aide de stat, mais aucun des touchindicateurs n'aboutit à un résultat correct. La date de modification est ajustée, mais elle a changé et la date d'accès est en fait changée pour MAINTENANT
Xerus,

Cela n'a pas fonctionné pour moi, il a seulement changé le temps de "Change"
Revious

@ Revious, Xerus Quelle est la différence entre l' changedheure et l' modifiedhorodatage?
ijoseph

9

Touch peut référencer la date d'un fichier tout seul, pas besoin d'appeler dateou d'utiliser la substitution de commande. Voici un peu de la page d'informations de touch:

`-r FILE' `--reference=FILE'
     Use the times of the reference FILE instead of the current time.
     If this option is combined with the `--date=TIME' (`-d TIME')
     option, the reference FILE's time is the origin for any relative
     TIMEs given, but is otherwise ignored.  For example, `-r foo -d
     '-5 seconds'' specifies a time stamp equal to five seconds before
     the corresponding time stamp for `foo'.  If FILE is a symbolic
     link, the reference timestamp is taken from the target of the
     symlink, unless `-h' was also in effect.

Par exemple, pour ajouter 8 heures à la date d'un fichier (nom du fichier entre fileguillemets juste en cas d'espaces, etc.):

touch -r "file" -d '+8 hour' "file"

Utiliser une boucle sur tous les fichiers du répertoire en cours:

for i in *; do touch -r "$i" -d '+8 hour' "$i"; done

J'ai entendu dire qu'il est plus sûr d' utiliser *et de laisser forchoisir les noms de fichiers lui-même , mais que cela devrait gérer la plupart des caractères fous comme les nouvelles lignes, les espaces, les guillemets, les barres obliques inverses dans un nom de fichier. (PS. Essayez de ne pas utiliser des caractères fous dans les noms de fichiers).find -print0 | xargs -0 touch ...

Par exemple, pour rechercher tous les fichiers thatdirdont les noms de fichiers commencent par un set ajouter un jour à l'horodatage modifié de ces fichiers, utilisez:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'

2

Ce petit script fonctionne au moins pour moi

#!/bin/bash

# find specific files
files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in ${files}
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v -1m -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done

2
Ajuster la date des images en fonction des méta-informations de l’image serait très utile. Le nom d'ImageMagick peut être utilisé. par exemple, 'identifier -verbose <image> | grep -i date', 'identifier -format% [exif: DateTime] <image>' pourrait indiquer '2015: 01: 08 10:19:10' (toutes les images ne possèdent pas de données exif ) Cela fonctionne (en utilisant sed pour convertir la date au format, tactile peut gérer): 'touch -d $ (identifier -format% [exif: DateTime] $ f | sed -r' /: / - /; s /: / - / ; ') $ f'
gaoithe

1

Cela fait longtemps que je n'ai pas écrit de programme Unix, mais j'ai accidentellement réglé l'année sur une série de photos de Noël et je savais que si je ne changeais pas la date de 2015 à 2014, ce serait un problème plus tard. .

C’est peut-être une tâche facile, mais je n’ai trouvé aucun moyen simple de le faire.

J'ai modifié un script trouvé ici, qui servait à l'origine à modifier la date de moins d'un mois.

Voici le script original:

#!/bin/bash

# find specific files
files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in ${files}
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v -1m -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done

Voici mon script modifié qui a forcé la date à l'année "2014":

#!/bin/bash 

# find specific files
#files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in $*
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v +1y -r $(stat -f %m  "${f}") +2014%m%d%H%M.%S) "${f}"
done

Je réalise maintenant que j'aurais pu faire une version plus générique:

#!/bin/bash 

# find specific files
#files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in $*
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch (+1y adds a year "-1y" subtracts a year)
 # Below line subtracts a year
 touch -t $(date -v -1y -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
 # Below line adds a year
 # touch -t $(date -v +1y -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done

Pour utiliser ce fichier, vous devez l’écrire et

chmod +x fn

éxécuter:

./fn files-to-change

fn = votre-nom-de-fichier-qui-est-votre-commande

Exemple

./fn *.JPG

changera la date de moins un an dans le répertoire où vous vous trouvez.


1
Identique au commentaire ci-dessus. La plupart des fichiers .jpg auront une date intégrée dans les méta-données ajoutées par la caméra. Cela fonctionne (en utilisant sed pour convertir la date au format, tactile peut gérer): 'touch -d $ (identifier -format% [exif: DateTime] $ f | sed -r' /: / - /; s /: / - / ; ') $ f'
Gaoithe

-6

il suffit de changer la date et l'heure dans les paramètres. puis enregistrez votre fichier, il change automatiquement


3
Snej recherche une solution de traitement par lots ou en ligne de commande pouvant être utilisée pour modifier plusieurs fichiers. Changer la date et l'heure du système et modifier les fichiers n'est probablement pas une solution idéale.
fabricator4

trop de triiiiiiicky !!!
Philippe Gachoud

Pour ceux qui utilisent d'autres systèmes d'exploitation via la recherche sur le Web, cette réponse est le moyen le plus simple de changer la date d'un fichier sur Mac OSX ("touch -d" donne "une option illégale").
Alanning

1
@alanning: OSX utilise BSD touch, pas GNU touch. Utilisez -t. developer.apple.com/library/mac/documentation/Darwin/Reference/…
Dominik R

Cela peut avoir des conséquences imprévues. Dans un système d'exploitation moderne, de nombreux fichiers sont modifiés en permanence. Bien que votre date soit modifiée, de nombreux autres fichiers risquent de recevoir une mauvaise date et tout peut arriver si quelque chose dans le système remarque qu'un fichier est plus ancien que prévu.
Joe
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.