我运行了以下命令:
find . -type f | xargs ls -ltrhg
为了在程序运行时获取最近编写的文件。
结果很奇怪:在列表的底部,我收到了最近的文件,但是最近创建的MOST非常缺少...那就是测试,我直接运行
touch asdf
接着是
find . -type f | xargs ls -ltrhg
然而asdf并不是最新的。
关于为什么这个命令似乎忽略了最近编写的文件,但是按照编辑它们的正确顺序返回了几百个文件的任何想法?
答案 0 :(得分:4)
程序在写入文件时最终调用write()。写入不会立即将任何内容放入磁盘。
除非您编程调用fdatasync()或其表兄,如fflush(),否则数据将保留在内核缓冲区中,直到内核决定将数据放入磁盘。您可以将一堆数据写入文件,而不会将其物理写入磁盘。这是一个性能功能。与内存访问相比,磁盘I / O非常慢。
这意味着,在实践中,您的程序可以找到比当前正在编写的文件更新的其他磁盘文件。
答案 1 :(得分:1)
问题可能是有很多文件,xargs将它们分成几个ls的调用。
(我怀疑缓冲区缓存是个问题。除非这是Unix的一些奇特的分布式版本,find,xargs和ls都应该读取和写入相同的缓冲区缓存。)