Ändern des Zeitstempels eines Symlinks

31

Ich kann den Zeitstempel einer regulären Datei ändern:

touch -t 201301291810 myfile.txt

Mit einem Symlink konnte ich nicht dasselbe machen. Ist es möglich?

Distribution: RHEL 5.8

amphibient
quelle
2
Welches Problem möchten Sie lösen?
mdpc
2
Aber warum ... welches globale Problem versuchen Sie anzusprechen? Ist das nur Ästhetik oder hat es einen wirklichen Zweck?
mdpc
7
das ist irrelevant. Ich gehe nicht in meine Geschäftslogik
amphibient
5
Diese Art von Informationen hilft uns allen, eine Lösung zu finden, die für Sie funktioniert. Es ist nicht unwichtig. Tut mir leid, dass Sie so sensibel sind, ich versuche nur zu helfen.
mdpc
4
Alter, es ist irrelevant. Gehen Sie einfach mit der Notwendigkeit, den Zeitstempel als gegebene Konstante, unveränderlich, zu ändern. Sie können alles in Frage stellen, was Sie wollen, aber es ändert sich nicht an meinem Ende. das macht die Befragung so ziemlich nutzlos, effektiv.
Viel

Antworten:

45

add switch -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
quelle
> touch -h -t 201301291810 mysymlink -> touch: ungültige Option - h Weitere Informationen erhalten Sie unter `touch --help '.
Amphibient
2
Sehen Sie sich das Zitat "Nur auf Systemen nützlich, die die Zeitstempel eines Symlinks ändern können" an.
mdpc
3
Es wurde auch erst kürzlich hinzugefügt (es ist nicht in dieser Manpage von 2010 ). Vielleicht muss er nur die neueste Version von coreutils bekommen. Hier ist der
Unterschied
Wenn dies die richtige Antwort ist, markieren Sie sie bitte als solche.
Qodeninja
@qodeninja Nach über sechs Jahren erwarte ich nicht wirklich, dass das OP es auf die eine oder andere Weise markiert.
Stephan
3

Möglicherweise benötigen Sie eine neuere Version von touch. Wenn dies keine Option ist und Sie C kennen, können Sie mit der lutimes-Funktion ein kleines Programm schreiben, um dies selbst zu tun .

Random832
quelle
0

Ein Brute-Force-Weg ist wie folgt:

 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
quelle
hat mich neugierig gemacht, welches system benötigt das Übrigens hat jede Datei, die erstellt wurde, während Sie das Systemdatum noch nicht festgelegt haben, auch diesen Zeitstempel
Aquarius Power
Weil man den einmal erstellten Symlink-Inode nicht ändern kann.
mdpc
0

Uhrzeit und Uhrzeit einer symbolischen Verknüpfung können mit der lutimesFunktion geändert werden . Das folgende Programm funktioniert für mich unter MacOSX und Linux, um beide Male von einer beliebigen Datei in eine symbolische Verknüpfung zu kopieren:

#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;
}

Wenn Sie die kompilierte Datei aufrufen copytime, copytime file linkkönnen Sie mit dem Befehl dafür sorgen, dass der Link dieselbe Uhrzeit und M-Zeit hat wie zuvor file. Es sollte nicht allzu schwierig sein, das Programm so zu ändern, dass die in der Befehlszeile angegebenen Zeiten verwendet werden, anstatt die Zeiten aus einer anderen Datei zu kopieren.

jochen
quelle