web-dev-qa-db-ja.com

作成または変更のタイムスタンプを設定する

utimesfutimesfutimensなどを使用して、ファイルのアクセスおよび変更のタイムスタンプを設定できます。

変更時刻は、ファイルデータが最後に変更された時刻です。同様に、「ctime」または変更時刻は、権限などのファイルの属性が最後に変更された時刻です。 (Linux/POSIXは、すでに説明したmtimeとctime、および「atime」またはアクセス時間の3つのタイムスタンプを維持します。)

変更タイムスタンプを設定する機能はありますか? (「変更」が属性変更または「ctime」である場合、not変更時間「mtime」。)(変更タイムスタンプを変更したいという周期的な性質を理解していますが、アーカイブソフトウェアを考えます-そうします正確にファイルを復元できるようにしてください。)

タイムスタンプを作成するための関数はありますか? (私は、それに気付いた ext2はこれをサポートしていませんが、Linuxがサポートしているファイルシステムについては、サポートしているかどうか疑問に思いました。)

それが不可能な場合、それができない理由は何ですか?

22
Thanatos

ext2/3の場合、場合によってはext4の場合、ディスクにあるファイル/tmp/foodebugfsを変更する場合は、ctimeツールを使用してこれを行うことができます。 /dev/sda1ctimeを201001010101に設定します。これは、2010年1月1日、時刻01:01を意味します。

警告:この操作の前にディスクをアンマウントする必要があります

# Update ctime
debugfs -w -R 'set_inode_field /tmp/foo ctime 201001010101' /dev/sda1

# Drop vm cache so ctime update is reflected
echo 2 > /proc/sys/vm/drop_caches

Command Line Kung Fu ブログから取得した情報。

22
ismail

私も同様の問題を抱えていて、ここに答えを書きました。

https://stackoverflow.com/a/17066309/39104

基本的に2つのオプションがあります。

  1. カーネルのわずかな変更(リンクに含まれるコード)
  2. システムクロックを目的のctimeに変更し、ファイルをタッチしてから、現在の時刻を復元します。 (リンクに含まれるシェルスクリプト)。
8
Eitan

http://lists.gnu.org/archive/html/coreutils/2010-08/msg00010.html ctimeは偽造できません(少なくとも偽造可能を意図したものではありません):

POSIXは、atimeとmtimeは、syscallsのutimensat()ファミリーを介して任意の時間にユーザー設定可能であると述べていますが、ctimemustは、ファイルのメタデータまたはコンテンツを変更するアクション。

テスト/デバッグのためにファイルのctimeを変更する必要がある場合は、 bindfs が役立つ場合があります。これは、あるディレクトリを別の場所にマウントし、ファイル属性に対して何らかの変換を行うことができるFuseファイルシステムです。オプション--ctime-from-mtimeを使用すると、各ファイルのctimeはそのmtimeと同じになり、touch -tで設定できます。

5
oliver

最も簡単な方法:

1) change System time
2) copy paste a file on another location.

windows 7で試してみましたが、3つのタイムスタンプすべてを変更することに成功しました。 Linuxのstatコマンドは、3つのタイムスタンプすべてが変更されていることを示しています。

1
SteP