从重负载的目录中(递归地)查找最旧文件的最便宜的方法

从重负载的目录中(递归地)查找最旧文件的最便宜的方法

在目录(包括下面的所有目录)中查找最旧文件的最便宜的方法是什么。假设目录由 SAN 支持并且负载很重。

有人担心“ls”可能会锁定并导致重负载下的系统性能下降。

编辑:Find 在一个简单的测试用例下表现非常好 - 在 SSD 驱动器上的 400 GB 文件中查找最旧的文件花费了 1/20 秒。但这是一台空载下的 MacBook Pro 笔记本电脑……所以这有点像苹果与橘子的测试案例。

顺便说一句,找出此类命令的实现(底层算法)的最佳方法是什么?

答案1

zsh

oldest=(**/*(.DOm[1]))

对于最旧的常规文件(zsh时间分辨率为秒)

使用 GNU 工具:

(export LC_ALL=C
 find . -type f -printf '%T@\t%p\0' |
   sort -zg | tr '\0\n' '\n\0' | head -n 1 |
   cut -f2- | tr '\0' '\n')

答案2

为了最大限度地减少外部进程的数量,您可以通过运行自定义脚本而不是适当的find.每个文件的目录遍历和目录stat()遍历都无法被优化掉,但您只需将迄今为止最旧的文件保留在内存中即可。

这是 Perl 中的尝试:

find2perl -eval 'BEGIN { our ($filename, $oldest); }
    my @s=stat(_); if (! defined $::oldest || $s[9] < $::oldest) {
        $::oldest=$s[9]; $::filename = $File::Find::name }
    END { print "$::filename\n" }' | perl

在我的测试中,在中等大的目录(129019 个节点)上,这实际上比 @StephaneChazelas“GNU Tools”版本慢了 50% 左右,但您可能会发现它在某些情况下效果更好,尤其是对于非常大的目录。

相关内容