gpt4 book ai didi

Linux 文件创建时间戳竞争条件

转载 作者:可可西里 更新时间:2023-11-01 11:48:05 26 4
gpt4 key购买 nike

我正在尝试做我认为在 Linux 下很简单的事情。我有一个运行各种测试程序的 bash 脚本,我想确定当前目录中的哪些文件是由测试程序创建的。所以我正在做这样的事情:

touch timestamp-filerun the testfind -newer timestamp-file -type f > list-of-filesrm -f timestamp-file

事实证明,find -newer 的粒度很差,因此通常会发生一些由测试程序生成的文件显示为比时间戳文件更旧的情况。然后我尝试了这个:

ls -tr1 | sed '1,/timestamp-file/d'

生成相同的列表。这通常 有效,但并非总是如此。我仍然遇到测试生成的文件显示为比时间戳文件更旧的情况。

谢谢!

附言我可以通过另一种方式完成此操作,方法是拍摄目录的两个快照,一个在测试程序运行之前,一个在运行之后,然后比较它们。第二个列表中不在第一个列表中的任何文件都必须由测试程序创建(我不关心后台作业或其他用户写入目录)。但是这个方法不是我想要的,因为如果在运行测试之前没有删除输出文件(它们应该是,但在某些情况下可能不是),这个方法会说它不是由测试程序,因为它在测试程序运行之前就在目录中。

最佳答案

实际上可以使用touch强制目录中所有当前文件的时间戳为过去很远的时间,如:

touch -t 200801010000.00 *

如果您在运行测试之前执行此操作,则“find -newer”获取它的时间应该有足够的差异。如果粒度是两分钟,您可以将所有当前文件设置为十分钟前,将时间戳文件设置为 5 分钟前,然后运行测试。

所以你的脚本变成:

touch -t (current time - 10 minutes) *
touch -t (current time - 5 minutes) timestamp-file
run the test
find -newer timestamp-file -type f > list-of-files
rm -f timestamp-file

假设您正确安装了 Perl,您可以执行以下操作以“date -t​​”的正确格式获取 5 分钟前(或使用 -600 表示 10 分钟):

use Date::Manip;
print UnixDate(DateCalc(ParseDateString("now"),"-300"),"%Y%m%d%H%M.%S") . "\n";

如果出于某种原因不允许您更改时间戳,请使用:

sleep 300
touch timestamp-file
sleep 300
run the test
find -newer timestamp-file -type f > list-of-files
rm -f timestamp-file

效果相同,但给你十分钟时间去喝杯咖啡(如果你不喝咖啡,则可以选择毒药)。

关于Linux 文件创建时间戳竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/408286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com