web-dev-qa-db-ja.com

シンボリックリンクのタイムスタンプを変更する

通常のファイルのタイムスタンプを変更する方法を知っています。

touch -t 201301291810 myfile.txt

私はシンボリックリンクで同じことをすることができませんでした。出来ますか?

ディストリビューション:RHEL 5.8

32
amphibient

スイッチ-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
46
Stephan

より新しいバージョンのtouchが必要になる場合があります。これがオプションではなく、Cを知っている場合は、 lutimes関数 を使用して自分で行う小さなプログラムを作成できます。

3
Random832

総当たりの方法は次のとおりです。

 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.
0
mdpc

シンボリックリンクのatimeとmtimeは、lutimes関数を使用して変更できます。次のプログラムは、MacOSXとLinuxで動作し、任意のファイルからシンボリックリンクに両方の時間をコピーします。

#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を使用して、リンクにfileと同じatimeおよびmtimeを持たせることができます。別のファイルから時刻をコピーする代わりに、コマンドラインで指定された時刻を使用するようにプログラムを変更することはそれほど難しくありません。

0
jochen