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
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
Respostas:
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
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 .
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.
A hora e o horário de um link simbólico podem ser alterados usando a lutimes
funçã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 link
poderá 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.