linux 为什么touch命令也会改变ctime?

2izufjch  于 12个月前  发布在  Linux
关注(0)|答案(2)|浏览(120)
# stat main.c
Access: 2023-12-14 23:43:08.299761676 +0800
Modify: 2023-12-14 23:43:08.274761678 +0800
Change: 2023-12-14 23:43:08.274761678 +0800
 Birth: -

# touch main.c
# stat main.c (all the three times changed.)
Access: 2023-12-14 23:43:37.956758479 +0800
Modify: 2023-12-14 23:43:37.893758486 +0800
Change: 2023-12-14 23:43:37.893758486 +0800
 Birth: -

# for -a option,atime and ctime will change.
# for -m option,atime mtime,ctime all three will change.

字符串
我很困惑为什么touch命令也会改变ctime?

touch changes the access and/or modification timestamps of the specified files.
(As you can see,only atime and mtime are mentioned.)

# options:
-a. Change the access timestamp only.
-m. Change the modification timestamp only.

# https://www.gnu.org/software/coreutils/manual/html_node/touch-invocation.html


所以我很困惑。
在touch命令之后,main. c的内容与之前相同。
但是时间变了。(我不明白。)

6mw9ycah

6mw9ycah1#

经过大量的谷歌搜索和阅读现有的类似问题的答案,我认为这是正确的总结:
touch只有修改atime的选项(访问时间)和mtime(修改时间),默认同时,因为它们是用户应该修改的唯一2个时间戳,并且可以设置为他们喜欢的任何特定时间戳,而ctime(更改时间)是指文件更改时的当前系统时间(因此,通过设计,用户很难设置为特定时间)。
atime被设置时,ctimeChange time)没有被设置,因为文件的内容和属性(除了atime)都没有被设置,所以没有关于文件的任何内容被C挂起。
ctime在设置mtime时被修改,因为mtime是文件的元数据的属性,而ctime在设置文件的任何元数据时被设置,而不是atime
除了上面提到的,与其他更新访问时间戳的命令(如cat)不同,touch总是更新ctime,即使用-a调用只更新访问时间,即使时间戳实际上没有改变,也要注意时间戳何时改变:

$ printf 'Hello World\n' > file

$ stat file | tail -4
Access: 2023-12-14 11:13:06.850045900 -0600
Modify: 2023-12-14 11:13:06.850045900 -0600
Change: 2023-12-14 11:13:06.850958200 -0600
 Birth: 2023-11-28 09:06:22.968048500 -0600

$ cat file
Hello World

$ stat file | tail -4
Access: 2023-12-14 11:13:21.743099800 -0600 <- changed
Modify: 2023-12-14 11:13:06.850045900 -0600
Change: 2023-12-14 11:13:06.850958200 -0600
 Birth: 2023-11-28 09:06:22.968048500 -0600

$ touch -a file

$ stat file | tail -4
Access: 2023-12-14 11:13:49.667423400 -0600 <- changed
Modify: 2023-12-14 11:13:06.850045900 -0600
Change: 2023-12-14 11:13:49.667271500 -0600 <- changed
 Birth: 2023-11-28 09:06:22.968048500 -0600

字符串
关于OP的评论:
我也很困惑,触摸不修改文件的内容,但mtime被更改。为什么?
因为你告诉它。touch是你调用来更新文件修改和/或访问时间的命令,所以这就是你调用它时它所做的。
有关详细信息,请参阅:

klsxnrf1

klsxnrf12#

touch被指定为更改文件访问和修改时间;更改更改时间是更改文件的元数据的副作用,并且touch对此没有任何控制(另请参阅touch使用的futimens()和utimensat()函数)。

相关问题