确定自上次以来目录内容是否已更改的最快方法

use*_*369 5 osx directory ruby

我有一个脚本,使用 * 检查目录mdls(按添加时间排序),并执行一些操作。然而,mdls它有点慢,所以我\xe2\x80\x99d 喜欢仅在绝对必要时(即目录内容已更改时)才运行它。

\n\n

我的想法是运行mdls一次并缓存结果,然后执行一些操作来跟踪目录的状态。在后续运行中,我\xe2\x80\x99d 再次运行检查操作并将结果与​​我的结果进行比较。如果不同,则重新运行mdls;如果没有,则使用缓存。

\n\n

我\xe2\x80\x99m 考虑其中一个du \'/dir/path\' | tail -1(如果目录大小​​保持等于字节,则\xe2\x80\x99s 可能内容没有\xe2\x80\x99t 更改)或ls \'/dir/path\' | md5\'.

\n\n

我目前更倾向于该md5解决方案,因为它对文件重命名具有弹性。然而,这两种解决方案都很hacky,我想知道是否有\xe2\x80\x99s更有效的东西(仍然很快)。

\n\n

如果有帮助的话,最终该解决方案将在 ruby​​ 脚本中使用。

\n\n
\n\n

* I\xe2\x80\x99m 没有将其发布到Ask Different,因为mdls这不是重点。它可以是任何其他缓慢的命令。

\n

ilk*_*chu 4

如果足以检查新的/已删除的文件(并忽略对现有mtime文件的修改),您可以使用目录本身的时间戳。

\n\n

您可以通过 获取它stat。这里的输出以 1970 年初以来的秒数为单位:

\n\n
$ stat -f %m "$dir"      # stat on OS X\n1512493220\n$ stat -c %Y "$dir"      # GNU coreutils stat\n1512493801\n$ stat -c %.9Y "$dir"    # nanoseconds too\n1512493801.802870731\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想检查对文件的修改,您可以检查所有时间戳,并使用以下命令获取最大的时间戳sort

\n\n
$\xc2\xa0stat -f %m "$dir"/* | sort -n | tail -1\n1512428453\n
Run Code Online (Sandbox Code Playgroud)\n\n

(这接近BashFAQ 003,它主要是关于查找具有最新时间戳/最大大小/等的文件,但包含一些相当复杂的解决方案。)

\n