Je sais comment changer l'horodatage d'un fichier normal:
touch -t 201301291810 myfile.txt
Je n'ai pas pu faire de même avec un lien symbolique. C'est possible?
Distro: RHEL 5.8
Je sais comment changer l'horodatage d'un fichier normal:
touch -t 201301291810 myfile.txt
Je n'ai pas pu faire de même avec un lien symbolique. C'est possible?
Distro: RHEL 5.8
Réponses:
ajouter le commutateur -h
touch -h -t 201301291810 myfile.txt
Mandatory arguments to long options are mandatory for short options too.
-a change only the access time
-c, --no-create do not create any files
-d, --date=STRING parse STRING and use it instead of current time
-f (ignored)
-h, --no-dereference affect each symbolic link instead of any referenced
file (useful only on systems that can change the
timestamps of a symlink)
-m change only the modification time
-r, --reference=FILE use this file's times instead of current time
-t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time
Vous aurez peut-être besoin d'une version plus récente de touch
. Si ce n'est pas une option, et si vous connaissez C, vous pouvez écrire un petit programme pour le faire vous-même en utilisant la fonction lutimes .
Un moyen de force brute est le suivant:
0. delete the old symlink you wish to change
1. change the system date to whatever date you want the symlink to be
2. remake the symlink
3. return the system date to current.
L'atime et le mtime d'un lien symbolique peuvent être modifiés à l'aide de la lutimes
fonction. Le programme suivant fonctionne pour moi sur MacOSX et Linux pour copier les deux fois d'un fichier arbitraire vers un lien symbolique:
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/time.h>
int
main(int argc, char **argv)
{
struct timeval times[2];
struct stat info;
int rc;
if (argc != 3) {
fprintf(stderr, "usage: %s source target\n", argv[0]);
return 1;
}
rc = lstat(argv[1], &info);
if (rc != 0) {
fprintf(stderr, "error: cannot stat %s, %s\n", argv[1],
strerror(errno));
return 1;
}
times[0].tv_sec = info.st_atime;
times[0].tv_usec = 0;
times[1].tv_sec = info.st_mtime;
times[1].tv_usec = 0;
rc = lutimes(argv[2], times);
if (rc != 0) {
fprintf(stderr, "error: cannot set times on %s, %s\n", argv[2],
strerror(errno));
return 1;
}
return 0;
}
Si vous appelez le fichier compilé copytime
, la commande copytime file link
peut être utilisée pour que le lien ait le même atime et mtime que lui file
. Il ne devrait pas être trop difficile de modifier le programme pour utiliser les heures spécifiées sur la ligne de commande au lieu de copier les heures d'un autre fichier.