Alterando o timestamp de um symlink

26

Eu sei como alterar o timestamp de um arquivo normal:

touch -t 201301291810 myfile.txt

Não consegui fazer o mesmo com um link simbólico. É possível?

Distro: RHEL 5.8

    
por amphibient 06.02.2013 / 00:40

4 respostas

39

adicione 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
    
por 06.02.2013 / 00:47
3

Você pode precisar de uma versão mais recente de touch . Se isto não é uma opção, e se você conhece C, você pode escrever um pequeno programa para fazer você mesmo usando o função lutimes .

    
por 06.02.2013 / 18:53
0

Um caminho de força bruta é o seguinte:

 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.
    
por 06.02.2013 / 18:59
0

O atime e o mtime de um link simbólico podem ser alterados usando a função lutimes . O programa a seguir funciona para mim no MacOSX e Linux para copiar as duas vezes de um arquivo arbitrário para um link simbólico:

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

Se você chamar o arquivo compilado copytime , então o comando copytime file link pode ser usado para fazer o link ter o mesmo atime e mtime que file faz. Não deve ser muito difícil modificar o programa para usar os horários especificados na linha de comando, em vez de copiar os tempos de outro arquivo.

    
por 05.10.2013 / 14:15