Sé cómo cambiar la marca de tiempo de un archivo normal:
touch -t 201301291810 myfile.txt
No pude hacer lo mismo con un enlace simbólico. ¿Es posible?
Distribución: RHEL 5.8
Sé cómo cambiar la marca de tiempo de un archivo normal:
touch -t 201301291810 myfile.txt
No pude hacer lo mismo con un enlace simbólico. ¿Es posible?
Distribución: RHEL 5.8
Respuestas:
agregar interruptor -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
Es posible que necesite una versión más reciente de touch
. Si esto no es una opción, y si conoce C, podría escribir un pequeño programa para hacerlo usted mismo usando la función lutimes .
Una forma de fuerza bruta es la siguiente:
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.
El tiempo y el tiempo de un enlace simbólico se pueden cambiar usando la lutimes
función. El siguiente programa me funciona en MacOSX y Linux para copiar ambas veces desde un archivo arbitrario a un enlace 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;
}
Si llama al archivo compilado copytime
, entonces el comando copytime file link
se puede usar para hacer que el enlace tenga el mismo tiempo y tiempo que el que file
tiene. No debería ser demasiado difícil modificar el programa para usar las horas especificadas en la línea de comando en lugar de copiar las horas de otro archivo.