Cambiar la marca de tiempo de un enlace simbólico

31

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

anfibio
fuente
2
¿Cuál es el problema que estás tratando de resolver?
mdpc
2
Pero por qué ... ¿qué problema más global estás tratando de abordar? ¿Es esto solo una estética o tiene un propósito real?
mdpc
77
Eso es irrelevante. No voy a entrar en mi lógica de negocios
anfibio
55
Este tipo de información nos ayuda a todos a llegar a una solución que funcione para usted. No es irrelevante. Lo siento, eres tan sensible, solo estoy tratando de ayudarte.
mdpc
44
amigo, es irrelevante. simplemente vaya con la necesidad de cambiar la marca de tiempo como una constante dada, invariable. puedes cuestionarlo todo lo que quieras pero no está cambiando por mi parte. lo que hace que el cuestionamiento sea bastante inútil, efectivamente. buena suerte
anfibio

Respuestas:

45

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
Stephan
fuente
> touch -h -t 201301291810 mysymlink -> touch: opción no válida - h Intente `touch --help 'para obtener más información.
anfibio
2
mire la cita "útil solo en sistemas que pueden cambiar las marcas de tiempo de un enlace simbólico".
mdpc
3
También se agregó recientemente (no está en esta página de manual de 2010 ). Tal vez solo necesita obtener la última versión de coreutils. Aquí está la diferencia de cuándo se agregó en 2009
Random832
Si esta es la respuesta correcta, márquela como tal.
qodeninja
@qodeninja Después de más de seis años, realmente no espero que el OP lo marque de una forma u otra.
Stephan
3

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 .

Aleatorio832
fuente
0

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.
mdpc
fuente
Me hizo sentir curiosidad, ¿qué sistema requiere esto? por cierto, cualquier archivo creado mientras aún no haya corregido la fecha del sistema también tendrá esa marca de tiempo
Aquarius Power
Porque uno no puede modificar el inodo de enlace simbólico una vez creado.
mdpc
0

El tiempo y el tiempo de un enlace simbólico se pueden cambiar usando la lutimesfunció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 linkse puede usar para hacer que el enlace tenga el mismo tiempo y tiempo que el que filetiene. 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.

jochen
fuente