web-dev-qa-db-fra.com

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

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 qui puisse modifier l’horodatage de tout un groupe de fichiers à une certaine heure plus tôt ou plus tard (par exemple, +8 heures ou -4 jours, etc.).

220
snej

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 commande touchname__:

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'indicateur -d 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 en findpour ne sélectionner que les fichiers qui vous intéressent. Si vous souhaitez uniquement mettre à jour les heures de modification du fichier 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 de touchname__.

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. ctimeest associé aux fichiers, mais il enregistre le moment de la dernière modification des métadonnées du fichier. 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, ce qui aura également pour effet secondaire de mettre à jour le ctimename__.

306
James Henstridge

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

45
EFL

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 NOWname__, supprimez simplement le -t et l’horodatage.

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

Voir: touch man

27
Jadeye

Touch peut référencer la date d'un fichier tout seul, il n'est pas nécessaire 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 filecité uniquement pour 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 de laisser forchoisir les noms de fichiers lui-même est plus sûr, mais utiliser find -print0 | xargs -0 touch ... devrait gérer la plupart caractères fous comme les retours à la ligne, les espaces, les guillemets, les backslashes nom de fichier. (PS. Essayez de ne pas utiliser des caractères fous dans les noms de fichiers).

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

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

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
joakim

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
RickK