Alterando o carimbo de data e hora de um link simbólico

31

Eu sei como alterar o carimbo de data e hora de um arquivo regular:

touch -t 201301291810 myfile.txt

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

Distro: RHEL 5.8

anfíbio
fonte
2
Qual é o problema que você está tentando resolver?
Mdpc
2
Mas por que .... que problema mais global você está tentando resolver? Isso é apenas estética ou tem um propósito real?
Mdpc
7
isso é irrelevante. Eu não estou indo para a minha lógica de negócios
amphibient
5
Esse tipo de informação ajuda a todos nós a chegar a uma solução que funcione para você. Não é irrelevante. Desculpe, você é tão sensível, só estou tentando ajudar.
Mdpc
4
cara, é irrelevante. basta ir com a necessidade de alterar o registro de data e hora como uma constante constante, invariável. você pode questionar tudo o que quiser, mas não está mudando do meu lado. o que torna o questionamento praticamente inútil e eficaz. boa sorte
anfíbio 06/02

Respostas:

45

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
Stephan
fonte
> touch -h -t 201301291810 mysymlink -> touch: opção inválida - h Tente `touch --help 'para obter mais informações.
amphibient
2
veja a citação "útil apenas em sistemas que podem alterar os carimbos de data e hora de um link simbólico".
Mdpc
3
Também foi adicionado apenas recentemente (não está nesta página de manual de 2010 ). Talvez ele precise apenas obter a versão mais recente do coreutils. Aqui está o diff de quando foi adicionado em 2009
Random832
Se esta for a resposta correta, marque-a como tal.
qodeninja 18/08
@qodeninja Depois de mais de seis anos, não espero que o OP o marque de uma maneira ou de outra.
Stephan
3

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

Random832
fonte
0

Uma maneira de força bruta é a 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.
mdpc
fonte
me deixou curioso, que sistema exige isso? btw, qualquer arquivo criado enquanto você ainda não fixou a data sytem terá que timestamp também
Aquarius Poder
Porque não é possível modificar o inode do link simbólico depois de criado.
Mdpc
0

A hora e o horário de um link simbólico podem ser alterados usando a lutimesfunção 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 , o comando copytime file linkpoderá ser usado para fazer com que o link tenha o mesmo atime e mtime file. 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 horários de outro arquivo.

jochen
fonte