我试图从一个目录中找到前 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)
什么是更好的方法来做到这一点?
在任何情况下,您都需要读取其中所有目录的内容并执行 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)
看看这是否使它更快。