找到最大的单个文件

找到最大的单个文件

我们托管大小为 4 TB 的共享。查找最大大小的文件的效率如何。

通常我们使用:

du -ak | sort -k1 -bn | tail -1

扫描如此巨大的份额然后再次对它们进行排序并不容易。

任何仅了解共享中最大的文件的建议。

并且还du -ak返回当前目录的大小,例如(“.123455”)。我该如何避免这种情况?

答案1

除了扫描相关目录树来收集文件大小以便确定最大文件之外,我不知道还有其他方法。如果您知道存在大小阈值,则可以指示 find 忽略低于此阈值大小的文件。

$ find . -type f -size +50M ....

将忽略任何小于 50MB 的文件。如果您知道这些文件始终位于特定位置,则可以将您的文件定位find到该区域,而不是扫描整个磁盘。

笔记:这是我通常使用的方法,因为/var通常您不应该在非类型的目录中获取随机文件。

至于du您可以告诉它使用开关以人类可读的格式输出尺寸-h。该sort命令也知道如何对它们进行排序,再次使用其-h开关。

例子

$ find /home/saml/apps -type f -size +50M -print0 | \
    du -h --files0-from=- | sort -h | tail -1
1.4G    /home/saml/apps/MeVisLabSDK2.2.1_gcc-64.bin

上面使用空 ( ) 字符作为分隔符find返回大于 50MB 的文件列表。\0du命令获取此列表并知道使用--files0-from=-开关对空值进行拆分。然后,该输出按照其人工格式的大小进行排序。

没有tail -1

$ find /home/saml/apps -type f -size +50M -print0 | \
    du -h --files0-from=- | sort -h
55M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/lib/libQtXmlPatternsMLAB.so.4.6.2.debug
55M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/Sources/Qt4/qt/lib/libQtXmlPatternsMLAB.so.4.6.2.debug
56M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/ThirdParty/lib/libitkvnl-4.0_d.a
66M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkAccessories_d.so
79M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkMLConverters_d.so
94M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/lib/libQtGuiMLAB.so.4.6.2.debug
94M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/Sources/Qt4/qt/lib/libQtGuiMLAB.so.4.6.2.debug
112M    /home/saml/apps/ParaView-3.14.1-Linux-64bit.tar.gz
204M    /home/saml/apps/Slicer-4.1.1-linux-amd64.tar.gz
283M    /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkIODWrappers_d.so
1.4G    /home/saml/apps/MeVisLabSDK2.2.1_gcc-64.bin

答案2

您需要遍历整个目录树并检查每个文件的大小才能找到最大的文件。

在 zsh 中,有一种简单的方法可以按大小对文件进行排序,这要归功于o 全局限定符:

print -rl -- **/*(D.oL)

要仅查看最大的文件:

echo **/*(D.oL[-1])

要查看 10 个最大的文件:

print -rl -- **/*(D.oL[-10,-1])

您还可以使用ls -S按大小对文件进行排序。例如,这显示了前 10 个最大的文件。在 bash 中,您需要shopt -s globstar首先运行以启用递归通配符**;在 ksh93 中,set -o globstar首先运行,在 zsh 中,这是开箱即用的。仅当文件数量不多以至于其名称的组合长度超过命令行限制时,此方法才有效。

ls -Sd **/* | head -n 10

如果有很多大文件,收集信息可能需要很长时间,并且您应该只遍历文件系统一次并将输出保存到文本文件中。由于您对单个文件感兴趣,除了;之外,还可以使用-SGNU 选项。这样,目录的显示不包括子目录中的文件大小,只包括直接在该目录中的文件,从而减少了噪音。du-a

du -Sak >du
sort -k1n du | head -n 2

如果您只需要文件的大小,您可以使用 GNU find 的-printf操作。

find -type f -printf '%s\t%P\n' | sort -k1n >file-sizes.txt
tail file-sizes.txt

请注意,如果您的文件名包含换行符,这将扰乱自动处理。大多数 GNU 实用程序都有一种方法来使用空字节(不能出现在文件名中),例如du -0, sort -z,\0代替\n等。

相关内容