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 に設定されます。
はtimes
3番目のパラメータですutimensat()
。touch file
最初のアクセス制限セットに属します。ファイルへのすべての書き込みアクセスは、アクセスおよび変更時間を「今」に変更することができます。 2 番目のアクセス制限セットに属します。アクセスと変更の時間を「現在」または「未変更」以外の値に変更するには、ファイルの所有者である必要がtouch -m file
あります。root
所有していないが読み書き可能なファイルへのアクセスおよび/または変更時間を「現在」に変更する他の方法があります。
- ファイルを読み取ると、アクセス時間だけが更新されます。
- ファイルの書き込み(いいえ読んでください)修正時間のみ更新されます。