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
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
Risposte:
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
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 .
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.
L'atime e il mtime di un collegamento simbolico possono essere modificati usando la lutimes
funzione. 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 link
possibile 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.