web-dev-qa-db-fra.com

Changer l'horodatage d'un lien symbolique

Je sais comment changer l'horodatage d'un fichier régulier:

touch -t 201301291810 myfile.txt

Je n'ai pas pu faire la même chose avec un lien symbolique. Est-il possible?

Distro: Rhel 5.8

32
amphibient

ajouter un 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
46
Stephan

Vous aurez peut-être besoin d'une version plus récente de touch. Si ce n'est pas une option, et si vous savez C, vous pouvez écrire un petit programme pour le faire vous-même à l'aide de la fonction LUTimes .

3
Random832

Une force de force brute est la suivante:

 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.
0
mdpc

L'ATime et MTIME d'un lien symbolique peuvent être modifiés à l'aide de la fonction lutimes. Le programme suivant fonctionne pour moi sur MacOSX et Linux de copier les deux fois à partir d'un fichier arbitraire à 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, alors la commande copytime file link Peut être utilisé pour que le lien ait le même atime et MTIME comme file fait. Il ne devrait pas être trop difficile de modifier le programme pour utiliser des temps spécifiés sur la ligne de commande au lieu de copier les temps d'un autre fichier.

0
jochen