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

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

touch -t 201301291810 myfile.txt

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

Distro: RHEL 5.8

26 голосов | спросил amphibient 6 FebruaryEurope/MoscowbWed, 06 Feb 2013 03:40:46 +0400000000amWed, 06 Feb 2013 03:40:46 +040013 2013, 03:40:46

4 ответа


38

добавить переключатель -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 6 FebruaryEurope/MoscowbWed, 06 Feb 2013 03:47:07 +0400000000amWed, 06 Feb 2013 03:47:07 +040013 2013, 03:47:07
3

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

ответил Random832 6 FebruaryEurope/MoscowbWed, 06 Feb 2013 21:53:39 +0400000000pmWed, 06 Feb 2013 21:53:39 +040013 2013, 21:53:39
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.
ответил mdpc 6 FebruaryEurope/MoscowbWed, 06 Feb 2013 21:59:27 +0400000000pmWed, 06 Feb 2013 21:59:27 +040013 2013, 21:59:27
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 может использоваться, чтобы ссылка имела одно и то же время atime и mtime как file. Не должно быть слишком сложно изменить программу на использование времени, указанного в командной строке, вместо копирования времени из другого файла.

ответил jochen 5 +04002013-10-05T16:15:22+04:00312013bEurope/MoscowSat, 05 Oct 2013 16:15:22 +0400 2013, 16:15:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132