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)
두 번째 ( touch -m file
)에. 첫 번째 호출은 "액세스 및 수정 시간을 현재 시간으로 설정"을 간략하게 표현한 것이며, 두 번째 호출은 "액세스 시간을 유지하고 수정 시간을 현재 시간으로 변경"을 의미합니다.
POSIX설명하다
파일의 사용자 ID와 동일한 유효 사용자 ID, 파일에 대한 쓰기 액세스 권한 또는 적절한 권한이 있는 프로세스만 사용할 수 있습니다.fortimen() 또는실용적인 위성()는 널 포인터를 다음과 같이 취합니다.이류인수 또는 둘 다TV_나노초필드는 특수 값 UTIME_NOW로 설정됩니다. 파일의 사용자 ID와 동일한 유효 사용자 ID 또는 적절한 권한이 있는 프로세스만 이를 사용할 수 있습니다.fortimen() 또는실용적인 위성() 및 비어 있지 않음이류둘 다 논쟁의 여지가 없습니다TV_나노초필드가 UTIME_NOW로 설정되어 있으며 둘 다 없습니다.TV_나노초필드는 UTIME_OMIT로 설정됩니다.
( times
는) 세 번째 매개변수 입니다 utimensat()
. touch file
첫 번째 액세스 제한 세트에 속합니다. 파일에 대한 모든 쓰기 액세스는 액세스 및 수정 시간을 "지금"으로 변경하도록 허용됩니다. 두 번째 액세스 제한 세트에 속합니다. 액세스 및 수정 시간을 "현재" 또는 "변경되지 않음"이 아닌 값으로 변경하려면 파일의 소유자 touch -m file
여야 합니다 .root
소유하지는 않지만 읽거나 쓸 수 있는 파일에 대한 액세스 및/또는 수정 시간을 "현재"로 변경하는 다른 방법이 있습니다.
- 파일을 읽으면 액세스 시간만 업데이트됩니다.
- 파일 쓰기(아니요읽어보세요) 수정 시간만 업데이트됩니다.