350 votes

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

Existe-t-il un moyen de modifier la date de modification/création d'un fichier (qui est affichée dans Nautilus ou avec la commande ls -l) ? Idéalement, je cherche une commande qui puisse modifier l'estampille de la date et de l'heure d'un ensemble de fichiers pour les avancer ou les retarder d'un certain temps (par exemple, +8 heures ou -4 jours, etc.).

464voto

Mark S. Rasmussen Points 13313

Tant que vous êtes le propriétaire du fichier (ou root), vous pouvez modifier le temps de modification d'un fichier à l'aide de la commande touch commandement :

touch filename

Par défaut, l'heure de modification du fichier est fixée à l'heure actuelle, mais il existe un certain nombre d'options, comme l'option -d pour 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 ce qui suit :

touch -d "2 hours ago" filename

Si vous souhaitez plutôt modifier le fichier par rapport à son heure de modification existante, ce qui suit devrait faire l'affaire :

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

Si vous souhaitez modifier un grand nombre de fichiers, vous pouvez utiliser la méthode suivante :

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 find pour ne 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 simplifier cette opération :

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

Cette forme n'est pas possible avec la version relative à la durée du fichier car elle utilise le Shell pour former les arguments à touch .

En ce qui concerne le temps de création, la plupart des systèmes de fichiers Linux ne gardent pas trace de cette valeur. Il existe un ctime associées aux fichiers, mais il permet de savoir quand les métadonnées du fichier ont été modifiées pour la dernière fois. Si les permissions du fichier ne sont jamais modifiées, il se peut que l'heure de création soit conservée, mais c'est une coïncidence. Changer explicitement l'heure de modification d'un fichier compte comme un changement de métadonnées, ce qui aura également pour effet de mettre à jour le fichier ctime .

82voto

Le moyen le plus simple - l'accès et la modification seront les mêmes :

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 NOW laissez tomber le -t et l'horodatage.

Pour vérifier qu'ils sont tous identiques : stat fileName.ext

Voir : touche humaine

61voto

Nicholas Leonard Points 600

Merci pour votre aide. Cela a fonctionné pour moi :

Dans le terminal, allez dans le répertoire de date-edit. 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 la touche Entrée, sauf pour la dernière fois -> "done".

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

"201203101513" = est la date que vous voulez pour tous les fichiers de ce répertoire.

15voto

Xen2050 Points 8190

Touch peut faire référence à la date d'un fichier par lui-même, sans avoir besoin d'appeler date ou utiliser la substitution de commande. Voici un extrait de la page d'information 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 de fichier de file cité juste en cas d'espaces, etc) :

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

Utilisation d'une boucle sur tous les fichiers dans le répertoire courant :

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

J'ai entendu dire que l'utilisation d'un * et en laissant for choisir le nom de fichier lui-même est plus sûr mais en utilisant find -print0 | xargs -0 touch ... devrait traiter le plus les caractères insensés comme les nouvelles lignes, les espaces, les guillemets, les barres obliques inversées dans un nom de fichier. (PS : essayez d'abord de ne pas utiliser ces caractères dans les noms de fichiers).

Par exemple, pour trouver tous les fichiers dans thatdir dont les noms de fichiers commencent par un s et ajouter un jour à l'horodatage modifié de ces fichiers, utiliser :

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

3voto

joakim Points 31

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X