Изменение временной метки символической ссылки

31

Я знаю, как изменить временную метку обычного файла:

touch -t 201301291810 myfile.txt

Я не смог сделать то же самое с символической ссылкой. Является ли это возможным?

Distro: RHEL 5.8

amphibient
источник
2
Какую проблему вы пытаетесь решить?
mdpc
2
Но почему .... какую глобальную проблему вы пытаетесь решить? Это просто астетика, или у нее есть реальная цель?
mdpc
7
это не имеет значения. я не буду
вдаваться
5
Этот тип информации помогает нам всем найти решение, которое будет работать для вас. Это не имеет значения. Извините, вы так чувствительны, я просто пытаюсь помочь.
mdpc
4
чувак, это не имеет значения. просто идти с необходимостью изменения временной метки как заданной константы, неизменной. Вы можете задавать вопросы все, что вы хотите, но это не меняется с моей стороны. что делает опрос практически бесполезным, эффективно. удачи
амфибия

Ответы:

45

добавить переключатель -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
источник
> touch -h -t 201301291810 mysymlink -> touch: неверный параметр - h Попробуйте `touch --help 'для получения дополнительной информации.
амфибия
2
посмотрите на цитату «полезно только в системах, которые могут изменять временные метки символической ссылки».
mdpc
3
Он также был добавлен только недавно (его нет на этой странице с 2010 года ). Возможно, ему нужно просто получить последнюю версию coreutils. Вот
разница,
Если это правильный ответ, отметьте его как таковой.
Коденинья
@qodeninja Спустя шесть лет я не ожидаю, что ФП отметит его так или иначе.
Стефан
3

Вам может понадобиться более свежая версия touch. Если это не вариант, и если вы знаете C, вы можете написать небольшую программу, чтобы сделать это самостоятельно, используя функцию lutimes .

Random832
источник
0

Путь грубой силы заключается в следующем:

 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.
Якорь,
источник
Мне стало любопытно, какая система требует этого? Кстати, любой файл, созданный, пока вы еще не исправили системную дату, также будет иметь эту временную отметку
Aquarius Power
Потому что один не может изменить inode symlink после создания.
mdpc
0

Atime и mtime символической ссылки могут быть изменены с помощью lutimesфункции. Следующая программа работает для меня на MacOSX и Linux, чтобы скопировать оба раза из произвольного файла в символическую ссылку:

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

Если вы вызываете скомпилированный файл copytime, то команда copytime file linkможет быть использована для того, чтобы ссылки имели то же самое время, что и время file. Не должно быть слишком сложно изменить программу, чтобы использовать времена, указанные в командной строке, вместо того, чтобы копировать времена из другого файла.

Jochen
источник