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

189

Existe-t-il un moyen de modifier 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.).

    
posée snej 22.09.2011 - 07:32
la source

7 réponses

255

Vous pouvez modifier l'heure de modification d'un fichier à l'aide de la commande touch :

touch filename

Par défaut, cela définira l'heure de modification du fichier à l'heure actuelle, mais il existe un certain nombre d'indicateurs, tels que l'indicateur -d , 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, voici ce qui devrait être fait:

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 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 ceci:

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 former les arguments à 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 ctime .

    
réponse donnée James Henstridge 22.09.2011 - 08:34
la source
39

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 "& gt;" après avoir appuyé sur Entrée, sauf pour la dernière fois - & gt; "fait".

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

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

Voir ma page Web

    
réponse donnée EFL 10.03.2012 - 15:21
la source
22

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 , déposez simplement -t et l'horodatage.

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

Voir: touch man

    
réponse donnée Jadeye 19.12.2015 - 15:58
la source
6

Touch peut faire référence à la date d'un fichier tout seul, sans avoir besoin d'appeler date ou d'utiliser une 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 à une date de fichier (nom de fichier de file cité uniquement dans les 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 que for choisisse les noms de fichiers est plus sûr , mais que find -print0 | xargs -0 touch ... devrait gérer la plupart des newlines, spaces, quotes, backslashes 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 thatdir dont les noms de fichiers commencent par s et ajouter un jour à l'horodatage modifié de ces fichiers, utilisez:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
    
réponse donnée Xen2050 17.12.2016 - 15:52
la source
2

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
    
réponse donnée joakim 06.08.2013 - 21:40
la source
1

Cela fait longtemps que je n’ai pas écrit de programme Unix, mais j’ai accidentellement défini l’année de manière incorrecte 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

pour exécuter:

./fn files-to-change

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

Exemple

./fn *.JPG

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

    
réponse donnée RickK 05.01.2015 - 00:28
la source
-6

changez simplement la date et l’heure dans les paramètres. puis enregistrez votre fichier, il change automatiquement

    
réponse donnée vampiremac 28.11.2012 - 09:37
la source

Lire d'autres questions sur les étiquettes