![找到最大的单个文件](https://linux22.com/image/36795/%E6%89%BE%E5%88%B0%E6%9C%80%E5%A4%A7%E7%9A%84%E5%8D%95%E4%B8%AA%E6%96%87%E4%BB%B6.png)
我们托管大小为 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 的文件列表。\0
该du
命令获取此列表并知道使用--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
如果有很多大文件,收集信息可能需要很长时间,并且您应该只遍历文件系统一次并将输出保存到文本文件中。由于您对单个文件感兴趣,除了;之外,还可以使用-S
GNU 选项。这样,目录的显示不包括子目录中的文件大小,只包括直接在该目录中的文件,从而减少了噪音。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
等。