You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Shell中重复生成空文件为何不更新文件修改时间?

关于重复生成空文件后修改时间未更新的问题

嘿,这个问题一点都不浅显——很多人第一次遇到这种情况都会摸不着头脑,完全没必要不好意思!

咱们先拆解下你遇到的场景:你用类似grep aaa ori.txt > test.txt的命令,当ori.txt里没有aaa时,test.txt会变成空文件。重复执行这个命令后,文件的修改时间没变化,对吧?

这其实是Unix-like系统的正常优化行为,原因在于:

  • 当你执行重定向> test.txt时,shell会先打开目标文件:如果文件不存在就创建它;如果已经存在,就把它截断为0长度。
  • 但如果grep没有输出(也就是你要找的内容不存在),那么截断后的文件不会被写入任何新内容,最终文件大小还是0。
  • 系统会判断文件的实际内容没有发生改变(本来就是0字节,截断后还是0字节),所以不会更新它的修改时间(mtime)——这是为了避免无意义的元数据写入,提升性能。

如果你确实需要每次执行命令后都强制更新文件的修改时间,可以在命令末尾加上touch命令,它会强制刷新文件的时间戳:

grep aaa ori.txt > test.txt && touch test.txt

另外,你可以用stat test.txt命令查看更详细的时间信息,比如:

  • atime:文件最后被访问的时间
  • mtime:文件内容最后被修改的时间(就是你现在关注的)
  • ctime:文件元数据(比如权限、大小)最后被修改的时间
    有时候重复执行命令后,ctime可能会更新,但mtime只有在内容真的变化时才会改变。

内容的提问来源于stack exchange,提问作者Helene

火山引擎 最新活动