在目录中查找最大的文件 - 花费大量时间

Ano*_* KR 4 ls find

我试图从一个目录中找到前 10 个大文件,该目录有很多子目录和 N 个文件。我的find命令将永远运行,因为它列出了所有文件,然后进入排序模式。我需要更快的执行。在我最近的运行中,列表本身并没有在 15 分钟内完成,我不得不终止执行。

我使用了以下find命令,它们都没有快速执行并且挂起:

find /opt/app -type f -print 2>/dev/null | xargs ls -lS 2>/dev/null |
    sort -k5,5rn | head -10

find /opt/app -xdev -ls | awk '{print $7, $11}' | " sort -rn "}' | head

find /opt/app -type f -exec ls -lS {} + 2>/dev/null | head -n 10 |
    awk '{ print $5, $9 }'
Run Code Online (Sandbox Code Playgroud)

什么是更好的方法来做到这一点?

Sté*_*las 5

在任何情况下,您都需要读取其中所有目录的内容并执行 a lstat(),这意味着读取 inode 数据以获取所有文件的文件大小,然后才能确定哪个文件最大。

除非所有信息都已缓存在内存中,否则磁盘(或网络文件系统的网络)I/O 访问将花费最多时间。

您的方法有很多不必要的事情,例如将用户/组 ID 转换为用户/组名称、计算时间戳的日历表示、将字节解码为字符,这些字符将使您的 CPU 忙于磁盘,但磁盘I/O 可能仍然是瓶颈。

如果您使用 instancezsh的 globs 和 glob 限定符,则可以跳过大部分不必要的处理:

ls -ldS /opt/apps/**/*(.DOL[1,10])
Run Code Online (Sandbox Code Playgroud)

或者使用(最近的)GNU 工具:

(export LC_ALL=C # avoid decoding bytes into characters and
                 # complex sorting orders. Note that it may affect
                 # the ls -l output format though.
 find /opt/apps -type f -printf '%s/%p\0' |
   sort -srnz |
   head -z |
   cut -zd/ -f2- |
   xargs -r0 ls -ldS)
Run Code Online (Sandbox Code Playgroud)

看看这是否使它更快。