如何在一个目录及其子目录中找到最大的文件?

121
我们刚开始学习UNIX课程,正在学习各种Bash命令。我们的任务涉及对一个包含多个文件夹的目录执行各种命令。
我知道如何使用以下命令列出并计算根文件夹中所有常规文件的数量:
find . -type l | wc -l

但是我想知道从哪里开始才能找到整个目录中最大的文件。我看过一些关于du命令的东西,但我们还没有学习过它,所以在我们已经学过的东西中,我认为我们需要以某种方式将其与ls -t命令连接起来。

如果我的术语不正确,请原谅,我还在适应中!


2
如果你知道某个命令,但不确定如何使用它,请尝试输入man加上你感兴趣的命令。会弹出一个很好的该命令的手册条目(按 q 返回命令行)。 - Dunes
相关:https://unix.stackexchange.com/questions/140367/finding-all-large-files-in-the-root-filesystem - Ciro Santilli OurBigBook.com
17个回答

141

引用自这个链接:

如果你想在特定目录及其子目录中查找并打印出前10个最大的文件名称(不包括目录),可以使用以下命令:

$ find . -type f -printf '%s %p\n'|sort -nr|head

要限制搜索到当前目录,请使用“-maxdepth 1”选项结合find命令:

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

如果您想打印出前10个最大的“文件和目录”,可以使用以下命令:

$ du -a . | sort -nr | head

** 在上述所有示例中,使用“head -n X”而不是只使用“head”来打印前X个最大的文件。


1
为什么“du -a . | sort -nr | head”返回的KB数量是实际文件大小的两倍? - xxjjnn
7
啊,你需要添加“k”选项,否则它会显示512字节的倍数而不是1024。du -ak - xxjjnn
2
对于第一个问题,你如何以人类可读的格式获取大小? - Bluz
6
对我来说,第一种解决方案在 OS X 上无效,所以最终我使用了一个快速的 hack 从第三种解决方案中过滤出目录:du -am . | sort -nr | grep '\..*\.' | head。这里的 m 是用来以 MB 显示文件大小,并且使用 grep 来显示至少有两个点的行,第一个点在路径中的 ./,第二个点则在文件扩展名中,例如 .mov - psmith
为什么不删除源引用并引用,因为“find”需要一个源没有的“-type f”。 - user2297550
显示剩余5条评论

74

查找当前目录及其子目录中的前25个文件:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

此命令将按照文件大小进行排序并输出前25个文件,使用了 "sort -nr -k5" 命令。

如果需要以人类可读的文件大小显示:

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25


10

在Linux/UNIX/BSD文件系统中,没有一个简单的命令可以查找最大的文件/目录。然而,通过以下三个命令的组合(使用管道),您可以轻松地找出最大文件的列表:

# du -a /var | sort -n -r | head -n 10

如果您想要更易读的输出,请尝试:

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

在这里,

  • Var 是你要搜索的目录
  • du命令-h选项:以人类可读的格式显示大小(例如,1K、234M、2G)。
  • du命令-s选项:只显示每个参数的总计(摘要)。
  • du命令-x选项:跳过不同文件系统上的目录。
  • sort命令-r选项:反转比较结果。
  • sort命令-h选项:比较人类可读数字。这是GNU sort特定的选项。
  • head command -10或-n 10选项:显示前10行。

我更喜欢第二个命令,但在OSX上,安装的sort版本没有-h选项。应该是:du -hsx * | sort -rn | head -10,适用于Mac。 - Yann VR
1
喜欢那个第二个命令!是我尝试过的最好的一个 - 我会留着以备不时之需。 - CodeMouse92

10
find . -type f | xargs ls -lS | head -n 1

输出

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

如果你只想要文件名:

find . -type f | xargs ls -1S | head -n 1

这样可以避免使用 awk,并允许您在 ls 中使用任何标志。

注意。由于xargs试图避免构建过长的命令行,如果您在包含大量文件的目录上运行它,则可能会失败,因为ls最终会执行多次。这不是无法克服的问题(您可以收集每个ls调用的head -n 1输出,并再次运行ls -S,循环直到只剩一个文件),但它确实使这种方法受到影响。


1
抱歉,xargs,我忽略了你 +1。 - Steve
3
处理文件名中带空格的方法是使用命令find . -type f -print0 | xargs -0 ls -lS | head -n 1 - rymo
这将在xargs执行的第一批中找到最大的文件。为了修复它,请添加排序功能: find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10。对我而言,在OSX上工作正常。 - psmith

9

这个命令会递归地列出普通文件,并按照第七个字段(在我的find输出中是文件大小,请检查你的输出)进行排序,然后只显示第一个文件。

find . -type f -ls | sort +7 | head -1
find的第一个选项是递归搜索的起始路径。 f类型的搜索普通文件。请注意,如果您尝试将其解析为文件名,则可能会失败,如果文件名包含空格、换行符或其他特殊字符。 sort的选项也因操作系统而异。我正在使用FreeBSD。
“更好”的解决方案是让find遍历目录,但也许使用stat获取有关文件的详细信息,然后再使用awk查找最大的大小。请注意,stat的输出也取决于您的操作系统。

1
“+7”参数的作用是什么?在我的机器上,排序只是抱怨找不到名为“+7”的文件。 - Dunes
2
似乎你的排序程序和我的不同。这是我排序程序的手册页面--http://linux.die.net/man/1/sort。为了在我的机器上工作,你需要显式地使用`-k`参数,例如`sort -k 7`。编辑:到OSX 10.5时,sort的手册页面似乎已经改变成我所拥有的版本。 - Dunes
1
@Dunes - 这都是GNU sort,但是不同版本。 [+POS1] [-POS2] 表示法只是旧版本的一种表示方法。据我所知,现代GNU sort仍然支持这种表示法,尽管现在看来,在5.1版本左右的sort man页面中已经删除了它。您可以在FreeBSD 4.11的sort man页面中看到它。我想自从FreeBSD 5.0发布之前,我就没有阅读过sort的man页面了! - ghoti
@Nakilon,感谢您的检查。OSX正在分歧,因为FreeBSD 10.0仍支持旧符号表示法,尽管手册将其描述为“过时”。 - ghoti
这对我有用,尽管在CentOS中我不得不修改代码:find . -type f -ls | sort -nk 7 | head -1 - Parapluie
显示剩余2条评论

6

这将查找您当前工作目录中最大的文件或文件夹:

ls -S /path/to/folder | head -1

查找所有子目录中最大的文件:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'

我认为ls的默认行为是以列的形式列出文件(即每行几个条目),因此第一个命令并没有确切地找到最大的文件。关于您的第二个命令,它只在给定目录中找到了最大的文件,而没有在其子目录中查找。 - Dunes
@Dunes:你说得对,第一个命令“可能”会找到目录,但不是因为ls的默认行为。在我的测试中,-S标志将每行列出一个文件。我已经纠正了第二个命令。希望现在它是完美无缺的。谢谢。 - Steve

4
在Solaris上,我使用:
find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

或者

find . -type f -ls | sort -nrk7 | head -1 #unformatted

因为这里发布的其他内容都没有起作用。 这将在$PWD和子目录中找到最大的文件。


2
尝试以下一行代码(显示前20个最大的文件):
ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

或(可读性强的大小):
ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

与其他答案相比,在Linux/BSD/OSX下运行良好,因为在OSX/BSD上找不到find的-printf选项,而stat根据操作系统有不同的参数。但是,要在OSX/BSD上正确运行第二个命令(因为sort没有-h),请从coreutils安装sort或从ls中删除-h并改用sort -nr。

因此,在您的rc文件中拥有这些别名非常有用:

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

这只显示文件名而不显示路径,因此实际上并不能帮助找到最大的文件。 - psmith
对我来说,我有一些非常大的文件,但最终这并不能给我正确的文件。 - Borislav Markov

2

尝试使用以下命令:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

这将打印出文件名和大小最大的文件,且大小超过500M。您可以移动 if($1 > 500000),它会打印出目录中最大的文件。


1
在文件夹中列出较大的文件。
ls -sh /pathFolder | sort -rh | head -n 1
ls -sh 的输出是文件大小的可读形式,包括大小 s 和人类可读的 h。您可以使用 ls -shS /pathFolder | head -n 1 命令。来自 ls 的更大的 S 已经将列表从大文件排序到小文件,但第一个结果是该文件夹中所有文件的总和。因此,如果您只想列出更大的文件,即一个文件,则需要使用 head -n 2 并检查“第二行结果”,或者使用带有 ls sort head 的第一个示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接