如何在大目录中找到最大文件大小

如何在大目录中找到最大文件大小

我有一个很大的目录,其中包含太多文件ls。我的想法:使用以下内容:

find . -name * -exec wc -c < {} \; | sort | tail -n 1

问题:shell 将其解释为 ( find . -name * -exec wc -c) < ( {} \;) | ...

我需要 上的“<” < {},以避免将文件名显示到sort.

我也尝试过

find . -name "*" -exec cat {} +| wc -c

然而,这似乎被解释为:( find . -name "*" -exec cat {}) | ( wc -c) ——所以它给出了所有文件组合的大小。

还有一个使用 du 的变体-- 然而,由于最大的文件可能仅相距几个字节,因此这仅显示一百万个 500 KB 大小的文件 -- 同样,对于 ls 来说太多了。

答案1

要打印最大的文件(大小以千字节为单位),LS方法:

ls -S1s --block-size=K | sed -n '2{p;q;}'

  • -S- 按文件大小排序,最大的在前

  • -s- 以块为单位打印每个文件的分配大小

  • -1- 每行列出一个文件

  • sed -n '2{p;q;}'- 输出中的第一行ls是带有大小的行total(例如total 388K)。第二行是包含最大文件及其大小的行。该表达式将仅考虑第二个所需的行

答案2

假设您的文件名都不包含换行符 ( \n),并且您有 GNU 实用程序,您可以使用此作为快速但肮脏的解决方案:

find . -maxdepth 1 -type f -exec stat --fmt $'%s\t%n' {} + | sort -n | tail -1

-maxdepth 1如果您有必须包含在搜索中的子目录,请将其删除。如果您find不支持终止符,+您可以将其替换为效率较低的终止符\;'%s'如果您不想输出文件名,请将格式字符串更改为 just 。


如果您的文件名中包含非打印字符,则可以使用此较慢的变体:

find . -maxdepth 1 -type f -exec stat --printf "%s\t" {} \; -print | sort -n | tail -1

-print如果您确实不想要文件名输出,请删除。


对于 OSX,我认为你可以使用这样的命令,但我没有简单的方法来测试它。-print如果您不需要文件名输出,请删除:

find . -maxdepth 1 -type f -exec stat -f '%z' -n {} \; -print | sort -n | tail -n 1

相关内容