如何递归查找目录中最新修改文件的时间戳?

7
我正在处理一个进程,需要在指定目录(递归)中的任何文件发生更改时重新启动。
我希望避免使用任何繁重的工具,比如inotify。我不需要知道哪些文件已更新,只需要知道是否有文件被更新。此外,我不需要被通知每一次更改,只需要知道在由进程动态确定的特定间隔内是否发生了任何更改。
必须有一种使用相当简单的bash命令来完成这个任务的方法。我不介意多次执行该命令;对于这种用例,性能不是我的主要关注点。但是,最好让命令尽可能快。
我唯一需要的输出是最后更改的时间戳,以便将其与存储在内存中的时间戳进行比较。
我也接受更好的解决方案。

对于任何文件的更改,我还需要知道有关新文件的信息。删除的文件是一个额外的奖励,但不是必需的。跟踪这些可能也更加困难。计算目录的校验和可以达到效果,但可能会非常缓慢。 - Marco Roy
4个回答

8

我在另一个相关问题中找到了一个很好的答案。

我只是稍微修改了一下命令以适应我的需求:

find . -type f -printf '%T@\n' | sort -n | tail -1

  1. %T@ 返回修改时间作为 Unix 时间戳,这正是我所需要的。
  2. sort -n 按数字顺序排序时间戳。
  3. tail -1 仅留下最后/最高的时间戳。

它运行得相当快; 在我的整个主目录上大约需要400ms,在目标目录上只需要大约30ms(使用 time [command] 进行测量)。


131,766个文件的处理时间为约400毫秒,而9387个文件的处理时间为约30毫秒。因此,每1000个文件的处理时间约为3毫秒。 - Marco Roy
使用find . -type f | wc -l进行计数。 - Marco Roy

4
我刚想到了一个比之前的解决方案更好的方法,它还可以让我知道已删除的文件。
这个想法是使用校验和,但不是所有文件的校验和;相反,我们只能对时间戳进行校验和。如果任何东西发生变化(新文件,删除的文件,修改的文件),那么校验和也会改变!
'%T@,'返回每个文件的修改时间作为Unix时间戳,全部在同一行上。
cksum计算时间戳的校验和。
????
Profit!!
实际上,它甚至比以前的解决方案(约20%)更快,因为我们不需要排序(这是最慢的操作之一)。即使是校验和也会快得多,特别是在如此少的数据量(每个时间戳22个字节)中,而不是对每个文件进行校验和。

1
备选校验和:md5sum,或者SHA系列中的一个(shasumsha1sumsha512sum等)。如果安全不是问题(对于我的用例来说并不是),则可以使用cksum,否则可能应该使用sha512sum - Marco Roy

1

不必记住最后更改的时间戳,而是可以记住最后更改的文件,并使用该文件查找更新的文件

find . -type f -newer "$lastfilethatchanged"

然而,如果同一文件再次更改,则此方法无法使用。因此,您可能需要首先使用touch创建一个临时文件:

touch --date="$previoustimestamp" "$tempfile"
find . -type f -newer "$tempfile"

"$tempfile" 可能在内存中的 /dev/shm/ 目录下,例如。


-1

$ find ./ -name "*.sqlite" -ls 在这里,您可以使用此命令获取文件信息。使用筛选器获取时间戳


我需要追踪任何文件的任何更改;我没有特定要使用“-name”跟踪的文件。我还需要知道新文件的情况。 - Marco Roy
哦,抱歉,我没有仔细阅读,但这更简单,因为您只需要grep特定目录中文件的时间戳并比较它们的时间戳。 您可以编写一个简单的shell脚本来执行此操作,以下步骤可能足以完成您的任务:
  1. 从目录中提取所有文件的时间戳
  2. 将其放入一个数组中并进行比较,以获取最新的时间戳并获取相应的目录
- user3156262
我不需要所有文件的时间戳,只需要最新的一个。"我需要的唯一输出是最后更改的时间戳,以便我可以将其与存储在内存中的时间戳进行比较。"我发现被接受的答案更容易实现这个目标。 - Marco Roy
是的,我明白你的意思。我是说你可以编写Shell脚本来实现这个目的。 - user3156262

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接