Zmiana znacznika czasu dowiązania symbolicznego

31

Wiem, jak zmienić znacznik czasu zwykłego pliku:

touch -t 201301291810 myfile.txt

Nie mogłem zrobić tego samego z dowiązaniem symbolicznym. Czy to możliwe?

Distro: RHEL 5.8

amfibia
źródło
2
Jaki problem próbujesz rozwiązać?
mdpc,
2
Ale dlaczego ... do jakiego globalnego problemu próbujesz się odnieść? Czy to tylko astetyka, czy ma jakiś prawdziwy cel?
mdpc,
7
to nie ma znaczenia. nie zajmuję się logiką biznesową
amfibia
5
Tego rodzaju informacje pomagają nam wszystkim znaleźć rozwiązanie, które będzie dla Ciebie odpowiednie. To nie jest bez znaczenia. Przepraszam, jesteś taki wrażliwy, staram się tylko pomóc.
mdpc
4
koleś, to nie ma znaczenia. po prostu idź z potrzebą zmiany znacznika czasu jako stałej, niezmiennej. możesz kwestionować to, co chcesz, ale z mojej strony to się nie zmienia. co sprawia, że ​​przesłuchanie jest praktycznie bezużyteczne, skutecznie. powodzenia
amfibia

Odpowiedzi:

45

dodaj przełącznik -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
źródło
> touch -h -t 201301291810 mysymlink -> touch: nieprawidłowa opcja - h Spróbuj `touch --help ', aby uzyskać więcej informacji.
amfibia
2
spójrz na cytat „przydatne tylko w systemach, które mogą zmieniać znaczniki czasu dowiązania symbolicznego”.
mdpc
3
Został również dodany dopiero niedawno (nie ma go na tej stronie z 2010 roku ). Może potrzebuje tylko najnowszej wersji coreutils. Oto różnica, kiedy został dodany w 2009 r.
Random832
Jeśli jest to poprawna odpowiedź, proszę ją zaznaczyć jako taką.
qodeninja
@qodeninja Po ponad sześciu latach tak naprawdę nie oczekuję, że OP oznaczy to w ten czy inny sposób.
Stephan
3

Możesz potrzebować nowszej wersji touch. Jeśli nie jest to opcja i jeśli znasz C, możesz napisać mały program, aby zrobić to sam, korzystając z funkcji lutimes .

Losowo 832
źródło
0

Brutalna siła jest następująca:

 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
źródło
zainteresował mnie, jaki system tego wymaga? btw, każdy plik utworzony, gdy jeszcze nie ustalono daty systemu, będzie miał także ten znacznik czasu
Aquarius Power
Ponieważ nie można modyfikować i-węzła dowiązania symbolicznego po utworzeniu.
mdpc
0

Atime i mtime dowiązania symbolicznego można zmienić za pomocą lutimesfunkcji. Poniższy program działa dla mnie w systemach MacOSX i Linux, aby skopiować oba razy z dowolnego pliku do dowiązania symbolicznego:

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

Jeśli wywołasz skompilowany plik copytime, copytime file linkmożesz użyć polecenia, aby łącze miało taki sam atime i mtime, jak to filerobi. Nie powinno być zbyt trudne zmodyfikowanie programu, aby używał czasów podanych w wierszu poleceń, zamiast kopiować czasy z innego pliku.

jochen
źródło