タッチはなぜ常に変わるだけで、所有者がいないのに何も変わらないのでしょうか?

タッチはなぜ常に変わるだけで、所有者がいないのに何も変わらないのでしょうか?

foobar私の所有ではありませんが、私のグループにはファイルがあります。

$ ll
total 4,0K
-rw-rw-r-- 1 root hbogert 4 jan 19 12:27 foobar

タッチするといつでも更新されます。

 $ stat foobar
  File: 'foobar'
  Size: 4           Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 4869333     Links: 1
Access: (0664/-rw-rw-r--)  Uid: (    0/    root)   Gid: ( 1000/ hbogert)
Access: 2017-01-19 12:27:04.499412133 +0100
Modify: 2017-01-19 12:27:04.499412133 +0100
Change: 2017-01-19 12:27:04.499412133 +0100
 Birth: -


 $ touch foobar


 $ stat foobar 
  File: 'foobar'
  Size: 4           Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 4869333     Links: 1
Access: (0664/-rw-rw-r--)  Uid: (    0/    root)   Gid: ( 1000/ hbogert)
Access: 2017-01-19 12:32:04.375412133 +0100
Modify: 2017-01-19 12:32:04.375412133 +0100
Change: 2017-01-19 12:32:04.375412133 +0100
 Birth: -

ただし、修正時間を変更しようとすると失敗します。

$ touch -m foobar
touch: setting times of 'foobar': Operation not permitted

これが予想される動作ですか?

ベストアンサー1

明らかではありませんが、この動作は予想されます。少なくとも私のシステムでtouch

utimensat(0, NULL, NULL, 0)

最初のケース(touch file)、

utimensat(0, NULL, [UTIME_OMIT, UTIME_NOW], 0)

2番目(touch -m file)に。最初の呼び出しは「アクセス時間と修正時間を現在の時間に設定する」を簡単に表し、2番目の呼び出しは「アクセス時間を維持し、変更時間を現在の時間に変更する」を意味します。

POSIX説明する

ファイルのユーザーIDと同じ有効ユーザーID、ファイルへの書き込みアクセス権、または適切な権限を持つプロセスのみを使用できます。fortimen( )または実用的な衛星() はヌルポインタを次のように取ります。移流引数またはその両方TV_ナノ秒フィールドは特殊値 UTIME_NOW に設定されます。ファイルのユーザーIDと同じ有効ユーザーIDまたは適切な権限を持つプロセスのみを使用できます。fortimen( )または実用的な衛星()と空ではない移流どちらも議論の余地はありませんTV_ナノ秒フィールドは UTIME_NOW に設定されており、両方はありません。TV_ナノ秒フィールドは UTIME_OMIT に設定されます。

times3番目のパラメータですutimensat()touch file最初のアクセス制限セットに属します。ファイルへのすべての書き込みアクセスは、アクセスおよび変更時間を「今」に変更することができます。 2 番目のアクセス制限セットに属します。アクセスと変更の時間を「現在」または「未変更」以外の値に変更するには、ファイルの所有者である必要がtouch -m fileあります。root

所有していないが読み書き可能なファイルへのアクセスおよび/または変更時間を「現在」に変更する他の方法があります。

  • ファイルを読み取ると、アクセス時間だけが更新されます。
  • ファイルの書き込み(いいえ読んでください)修正時間のみ更新されます。

おすすめ記事