Modifica del timestamp di un collegamento simbolico


31

So come modificare il timestamp di un file normale:

touch -t 201301291810 myfile.txt

Non sono stato in grado di fare lo stesso con un collegamento simbolico. È possibile?

Distro: RHEL 5.8


2
Qual è il problema che stai cercando di risolvere?
mdpc,

2
Ma perché .... quale altro problema globale stai cercando di affrontare? È solo un problema di astenia o ha uno scopo reale?
mdpc,

7
questo è irrilevante. non entrerò nella mia logica aziendale
anfibio il

5
Questo tipo di informazioni aiuta tutti noi a trovare una soluzione che funzioni per te. Non è irrilevante. Scusa se sei così sensibile, sto solo cercando di aiutarti.
mdpc,

4
amico, è irrilevante. basta andare con la necessità di cambiare il timestamp come una costante costante, invariabile. puoi metterlo in discussione tutto quello che vuoi ma non sta cambiando da parte mia. il che rende le domande praticamente inutili, efficaci. buona fortuna
anfibio,

Risposte:


45

aggiungi 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

> touch -h -t 201301291810 mysymlink -> touch: opzione non valida - h Prova `touch --help 'per maggiori informazioni.
anfibio,

2
guarda la citazione "utile solo su sistemi che possono cambiare i timestamp di un symlink".
mdpc,

3
Inoltre è stato aggiunto solo di recente (non è in questa manpage del 2010 ). Forse ha solo bisogno di ottenere l'ultima versione di coreutils. Ecco la differenza di quando è stato aggiunto nel 2009
Random832

Se questa è la risposta corretta, contrassegnala come tale.
qodeninja,

@qodeninja Dopo oltre sei anni, non mi aspetto che l'OP lo segnerà in un modo o nell'altro.
Stephan,

3

Potrebbe essere necessaria una versione più recente di touch. Se questa non è un'opzione e se conosci C, potresti scrivere un piccolo programma per farlo da solo usando la funzione lutimes .


0

Un modo di forza bruta è il seguente:

 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.

mi ha incuriosito, quale sistema richiede questo? tra l'altro, qualsiasi file creato mentre non hai ancora corretto la data di sistema avrà anche quel timestamp
Aquarius Power

Perché non è possibile modificare l'inode symlink una volta creato.
mdpc,

0

L'atime e il mtime di un collegamento simbolico possono essere modificati usando la lutimesfunzione. Il seguente programma funziona per me su MacOSX e Linux per copiare entrambe le volte da un file arbitrario a un collegamento simbolico:

#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 si chiama il file compilato copytime, è copytime file linkpossibile utilizzare il comando per fare in modo che il collegamento abbia lo stesso atime e mtime file. Non dovrebbe essere troppo difficile modificare il programma per usare i tempi specificati sulla riga di comando invece di copiarli da un altro file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.