Modification de l'horodatage d'un lien symbolique

31

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

amphibient
la source
2
Quel est le problème que vous essayez de résoudre?
mdpc
2
Mais pourquoi ... quel problème plus global essayez-vous de résoudre? Est-ce juste de l'asthétique, ou a-t-il un but réel?
mdpc
7
cela n'est pas pertinent. je n'entre pas dans ma logique métier
amphibient
5
Ce type d'informations nous aide tous à trouver une solution qui fonctionnerait pour vous. Ce n'est pas hors de propos. Désolé, vous êtes si sensible, j'essaie juste d'aider.
mdpc
4
mec, ce n'est pas pertinent. il suffit d'aller avec le besoin de changer l'horodatage comme une constante donnée, invariable. vous pouvez tout remettre en question, mais cela ne change pas de mon côté. ce qui rend le questionnement pratiquement inutile, effectivement. bonne chance
amphibie

Réponses:

45

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
Stephan
la source
> touch -h -t 201301291810 mysymlink -> touch: option invalide - h Essayez `touch --help 'pour plus d'informations.
amphibient
2
regardez la citation "utile uniquement sur les systèmes qui peuvent changer les horodatages d'un lien symbolique".
mdpc
3
Il a également été ajouté récemment (il ne figure pas dans cette page de manuel de 2010 ). Peut-être qu'il a juste besoin d'obtenir la dernière version de coreutils. Voici la différence de date à laquelle il a été ajouté en 2009
Random832
Si c'est la bonne réponse, veuillez la marquer comme telle.
qodeninja
@qodeninja Après plus de six ans, je ne m'attends pas vraiment à ce que le PO le marque dans un sens ou dans l'autre.
Stephan
3

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 .

Au hasard832
la source
0

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.
mdpc
la source
m'a rendu curieux, quel système l'exige? btw, tout fichier créé alors que vous n'avez pas encore fixé la date du système aura également cet horodatage
Aquarius Power
Parce que l'on ne peut pas modifier l'inode de lien symbolique une fois créé.
mdpc
0

L'atime et le mtime d'un lien symbolique peuvent être modifiés à l'aide de la lutimesfonction. 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 linkpeut ê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.

jochen
la source