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


Y a-t-il un moyen de changer la date de modification / création d'un fichier (affichée dans Nautilus ou avec la commande ls -l)? Idéalement, je recherche une commande qui permette de modifier l’horodatage de tout un tas de fichiers à une certaine heure plus tôt ou plus tard (par exemple, +8 heures ou -4 jours, etc.).


192
2017-09-22 05:32


origine




Réponses:


Vous pouvez modifier l'heure de modification d'un fichier en utilisant le touch commander:

touch filename

Par défaut, l’heure de modification du fichier correspond à l’heure actuelle, mais il existe un certain nombre d’indicateurs, tels que le -d drapeau pour choisir une date particulière. 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 modifier le fichier par rapport à son heure de modification existante, vous devez procéder 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 changer les arguments en find pour sélectionner uniquement les fichiers qui vous intéressent. Si vous souhaitez uniquement mettre à jour les délais de modification des fichiers par rapport à l'heure actuelle, vous pouvez simplifier les choses pour:

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

Ce formulaire n’est pas possible avec la version relative à l’heure du fichier car il utilise le shell pour touch.

En ce qui concerne le moment de la création, la plupart des systèmes de fichiers Linux ne suivent pas cette valeur. Il y a un ctime associé aux fichiers, mais il suit la dernière modification des métadonnées du fichier. Si les autorisations du fichier ne sont jamais modifiées, il se peut que le moment de la création soit conservé, mais il s'agit d'une coïncidence. La modification explicite de l’heure de modification du fichier compte pour un changement de métadonnées, ce qui aura également pour effet secondaire de mettre à jour le fichier. ctime.


259
2017-09-22 06:34



Pour mentionner le cas le plus simple lorsque tous les fichiers se trouvent dans le même dossier: touch -d "2 hours ago" /path/*.txt, par exemple. - enzotib
J'ajouterais aussi que changer le ctime n'est pas possible de manière standard. - arrange
Est-ce tout POSIX? - user1011471
Les informations sur ctime en tant que métadonnées, l'heure du changement provient de POSIX. Je ne sais pas si les fragments de shell dans ma réponse fonctionneraient avec des utilitaires shell POSIX stricts. Mais ils travaillent définitivement sur Ubuntu, qui est le contexte des réponses sur ce site. - James Henstridge
touch: illegal option -- d - User


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

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

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


40
2018-03-10 14:21



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


La manière la plus simple - accessible et modifiée sera la 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 NOW il suffit de déposer le -t et l'horodatage.

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

Voir: toucher l'homme


22
2017-12-19 14:58



J'ai essayé de le vérifier en utilisant stat, mais aucun des touch les drapeaux conduisent à un résultat correct. La date de modification est ajustée, mais la date de modification et d’accès est en fait modifiée à MAINTENANT - Xerus


Touch peut faire référence à la date d'un fichier tout seul, pas besoin d'appeler date ou utilisez 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 de fichier de file cité 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 que l'utilisation d'un * et laisser for choisir le nom de fichier lui-même est plus sûr, mais en utilisant find -print0 | xargs -0 touch ...  devrait gérer plus 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 en premier lieu).

Par exemple, pour rechercher tous les fichiers dans thatdirdont les noms de fichiers commencent par un s, et ajouter un jour à l'horodatage modifié de ce fichier, utilisez:

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

6
2017-12-17 14:52





Ce petit script au moins fonctionne 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
2017-08-06 19:40



Ajuster la date des images en fonction des métadonnées dans l'image serait très utile. L'identifiant d'ImageMagick peut être utilisé. par exemple. 'identifier -verbose <image> | grep -i date', 'identifier -format% [exif: DateTime] <image>' peut afficher '2015: 01: 08 10:19:10' (toutes les images n'ont pas de données exif) . Cela fonctionne (utiliser sed pour convertir la date au format tactile peut gérer): 'touch -d $ (identifie -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f' - gaoithe


Cela fait longtemps que je n'ai pas écrit de programme Unix, mais j'ai accidentellement fixé l'année sur un tas 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 .

Peut-être que c'est une tâche facile, mais je n'ai trouvé aucun moyen simple de le faire.

J'ai modifié un script que j'ai trouvé ici, qui à l'origine était utilisé pour modifier la date de moins 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
2018-01-04 23:28



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


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


-6
2017-11-28 08:37



Snej recherche une solution par lots ou en ligne de commande permettant de modifier plusieurs fichiers. Changer l'heure et la date du système et modifier les fichiers n'est probablement pas la solution idéale. - fabricator4
trop de triiiiiiicky !!! - Philippe Gachoud
Pour ceux qui ont d'autres systèmes d'exploitation amenés ici via la recherche Web, cette réponse est le moyen le plus simple de changer la date d'un fichier sur Mac OSX ('touch -d' se traduit par 'option illégale'). - alanning
@alanning: OSX a 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 OS moderne, de nombreux fichiers sont constamment modifiés dans les coulisses. Bien que votre date soit modifiée, de nombreux autres fichiers peuvent contenir des horodatages erronés et tout peut se produire lorsque quelque chose d’autre dans le système remarque qu’un fichier est plus ancien que prévu. - Joe