一般ファイルのタイムスタンプを変更する方法を知っています。
touch -t 201301291810 myfile.txt
シンボリックリンクを使用して同じことを行うことはできません。可能ですか?
リリース: RHEL 5.8
答え1
スイッチの追加 -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
答え2
最新バージョンが必要な場合がありますtouch
。これがオプションではなくCを知っている場合は、次のように小さなプログラムを直接作成できます。黄体機能。
答え3
無差別代入クラッキング方法は次のとおりです。
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.
答え4
この関数を使用してシンボリックリンクのatimeとmtimeを変更できますlutimes
。次のプログラムはMacOSXとLinuxで動作し、すべてのファイルをシンボリックリンクに2回コピーします。
#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;
}
コンパイルされたファイルを呼び出す場合は、copytime
このコマンドを使用してcopytime file link
リンクがリンクと同じatimeとmtimeを持つようにすることができますfile
。他のファイルから時間をコピーする代わりに、コマンドラインで指定された時間を使用するようにプログラムを変更することはそれほど難しくありません。