关于Bash:Bash – 如何在目录及其子目录中找到最大的文件?

Bash - How to find the largest file in a directory and its subdirectories?

我们刚开始一个Unix课程,正在学习各种bash命令。我们的分配涉及到对一个目录执行各种命令,该目录下也有许多文件夹。

我知道如何列出和计算根文件夹中的所有常规文件,使用:

1
find . -type l | wc -l

但我想知道从那里去哪里才能找到整个目录中最大的文件。我见过一些关于du命令的东西,但是我们还没有学到,所以在我们学到的东西中,我假设我们需要以某种方式将它与ls -t命令联系起来。

请原谅,如果我的"行话"不正确,我还是会习惯的!


引用此链接-

If you want to find and print the top 10 largest files names (not
directories) in a particular directory and its sub directories

$ find . -printf '%s %p
'|sort -nr|head

To restrict the search to the present directory use"-maxdepth 1" with
find.

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

And to print the top 10 largest"files and directories":

$ du -a . | sort -nr | head

** Use"head -n X" instead of the only"head" above to print the top X largest files (in all the above examples)


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

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

这将通过"sort-nr-k5"piped命令根据文件大小排序,输出前25个文件。

相同,但具有人类可读的文件大小:

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


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

输出

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

如果只需要文件名:

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

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

警告。因为xargs试图避免构建过长的命令行,所以如果在包含大量文件的目录上运行它,这可能会失败,因为ls最终执行了多次。这不是一个不可克服的问题(您可以从每个ls调用中收集head -n 1输出,然后再次运行ls -S,循环直到有一个文件为止),但它确实会有点破坏这种方法。


如果文件是普通文件,它会递归地列出文件,按第7个字段排序(这是我的find输出中的大小;检查您的),并只显示第一个文件。

1
find . -type f -ls | sort +7 | head -1

find的第一个选项是递归搜索的起始路径。一种类型的f搜索普通文件。请注意,如果您试图将其解析为文件名,则如果文件名包含空格、换行符或其他特殊字符,则可能会失败。sort的选项也因操作系统而异。我用的是freebsd。

一个"更好"但更复杂和更重的解决方案是让find遍历目录,但可能使用stat获取文件的详细信息,然后使用awk查找最大的大小。注意,stat的输出也取决于您的操作系统。


在linux/unix/bsd文件系统上,没有简单的命令来查找最大的文件/目录。但是,结合以下三个命令(使用管道),您可以很容易地找到最大文件的列表:

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

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

1
2
$ 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特定排序选项。
  • head命令-10或-n 10选项:显示前10行。


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

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

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

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


在我使用的Solaris上:

1
find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

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

因为这里贴的其他东西都不管用。这将在$PWD和子目录中找到最大的文件。


尝试以下一行(显示前20个最大的文件):

1
ls -1Rs | sed -e"s/^ *//" | grep"^[0-9]" | sort -nr | head -n20

或(人类可读大小):

1
ls -1Rhs | sed -e"s/^ *//" | grep"^[0-9]" | sort -hr | head -n20

Works fine under Linux/BSD/OSX in comparison to other answers, as find's -printf option doesn't exist on OSX/BSD and stat has different parameters depending on OS. However the second command to work on OSX/BSD properly (as sort doesn't have -h), install sort from coreutils or remove -h from ls and use sort -nr instead.

所以这些别名在RC文件中很有用:

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


尝试以下命令:

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

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


Linux解决方案:例如,您希望根据文件/文件夹大小(降序)查看主目录(/)的所有文件/文件夹列表。

sudo du-xm/排序-rn更多


du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'


1
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max"\t" ff;}'

列出文件夹中较大的文件

1
ls -sh /pathFolder | sort -rh | head -n 1

ls -sh的输出是一个大小为s和人类h的文件大小可理解的视图。

你可以使用ls -shS /pathFolder | head -n 1ls中较大的s已经从较大的文件订购到较小的文件,但第一个结果是该文件夹中所有文件的总和。因此,如果您只想列出更大的文件,一个文件,您需要head -n 2并检查"第二行结果",或者使用ls sort head的第一个示例。


这是非常简单的方法:

1
ls -l | tr -s"""" | cut -d"" -f 5,9 | sort -n -r | head -n 1***

你会得到这个:8445 examples.desktop


此脚本简化了查找最大文件以进行进一步操作。我把它保存在我的~/bin目录中,并把~/bin放在我的$path中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo"$1" | cksum`; echo"${hasch//[!0-9]}"; }
function usage() { echo"Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n"$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n"$units" || usage
        test -x $(echo"$count" | sed s/[0-9]//g) || usage
        if ["$units" =="T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn""$i};print N"" fn }'
}

arg1 $1
main $size