ぶていのログでぶログ

思い出したが吉日

1秒前のmtimeを持つファイルを作る

どうも、シェル=ゲイニンです。 社内のissueコメントに、 1秒前のmtimeを持つファイルを作るのはシェルじゃ無理と書かれていたので カッとなって即レスした。反省してない。 その内容をこっちにも転記。

touch -d

$ date; touch -d "1 second ago" hoge; stat hoge
201489日 土曜日 19:06:43 JST
  File: `hoge'
  Size: 0               Blocks: 0          IO Block: 4096   通常の空ファイル
Device: fc00h/64512d    Inode: 2634263     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    buty)   Gid: (    0/    root)
Access: 2014-08-09 19:06:42.731358344 +0900
Modify: 2014-08-09 19:06:42.731358344 +0900
Change: 2014-08-09 19:06:43.729271927 +0900
 Birth: -

touch-dオプションに1 second agoを指定すればできる。 もちろん、10秒前だったり、1ヶ月前だったりも同様にできる。 ちなみに、dateコマンドの-dオプションも同じ動作する。

応用: あるファイルのmtimeより1秒前のmtimeを持つファイルを作る

touch-rオプションで指定したファイルのタイムスタンプを参照することができる。 これを-dと組み合わせれば

$ stat hoge
  File: `hoge'
  Size: 0               Blocks: 0          IO Block: 4096   通常の空ファイル
Device: fc00h/64512d    Inode: 2634263     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    buty)   Gid: (    0/    root)
Access: 2014-08-09 19:06:42.731358344 +0900
Modify: 2014-08-09 19:06:42.731358344 +0900
Change: 2014-08-09 19:06:43.729271927 +0900
 Birth: -

$ touch -r hoge -d "1 second ago" fuga
$ stat fuga
  File: `fuga'
  Size: 0               Blocks: 0          IO Block: 4096   通常の空ファイル
Device: fc00h/64512d    Inode: 2634266     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    buty)   Gid: (    0/    root)
Access: 2014-08-09 19:06:41.731358344 +0900
Modify: 2014-08-09 19:06:41.731358344 +0900
Change: 2014-08-09 19:10:20.585271927 +0900
 Birth: -