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


102

我们刚刚开始UNIX类,并且正在学习各种Bash命令。我们的工作涉及在目录下执行各种命令,该目录下还包含许多文件夹。

我知道如何使用以下方法列出和计数根文件夹中的所有常规文件:

find . -type l | wc -l

但是我想知道从那里去哪里才能找到整个目录中最大的文件。我已经看到了有关du命令的一些信息,但是我们还没有学到,所以在我们学到的所有命令中,我认为我们需要以某种方式将其连接到ls -t命令。

如果我的“行话”不正确,请原谅我,我仍然会习惯它!


2
如果您知道某个命令,但不确定如何使用,请尝试在man您感兴趣的命令后键入。Up将为该命令弹出一个不错的手动输入项(按q返回至命令行)。
Dunes 2012年

Answers:


126

引用自这个链路

如果要查找并打印特定目录及其子目录中的前10大文件名(而非目录)

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

要将搜索限制为当前目录,请在查找中使用“ -maxdepth 1”。

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

并打印出前十个最大的“文件和目录”:

$ du -a . | sort -nr | head

**使用“ head -n X”代替上面的唯一“ head”来打印头X个最大的文件(在上述所有示例中)


1
为什么“ du -a。| sort -nr | head”返回的KB数是实际文件大小的两倍?
xxjjnn 2013年

6
嗯,您需要添加'k'选项,否则它显示512字节而不是1024的倍数。du -ak
xxjjnn 2013年

2
对于第一个,如何以人类可读的格式获取尺寸?
Bluz

@Bluz我想尝试更换'%s %p\n''%p\n'和添加|xargs ls -lh到年底
邓肯X辛普森

6
对我而言,第一个解决方案无法在OS X上运行,因此我最终使用了快速技巧来从第三种解决方案中过滤出目录:du -am . | sort -nr | grep '\..*\.' | head。的m是在显示兆字节的文件大小和用于grep向显示线与至少两个点,第一个是在./路径中,第二个是在文件扩展名,例如.mov
psmith

63

要查找当前目录及其子目录中的前25个文件,请执行以下操作:

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

这将通过“ sort -nr -k5”管道命令根据文件的大小排序,输出前25个文件。

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

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


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最终会执行多次。这不是一个无法解决的问题(您可以head -n 1从每次ls调用中收集输出,然后ls -S再次运行,循环直到只有一个文件为止),但是确实会破坏这种方法。


抱歉xargs,我忽略了+1
史蒂夫(Steve)

2
使用空格处理文件名,请使用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

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 command -h选项:以人类可读的格式显示大小(例如1K,234M,2G)。
  • du command -s选项:仅显示每个参数的总数(摘要)。
  • du命令-x选项:跳过不同文件系统上的目录。
  • sort命令-r选项:反转比较结果。
  • sort命令-h选项:比较人类可读的数字。这仅是GNU排序特定的选项。
  • head命令-10 OR -n 10选项:显示前10行。

我更喜欢第二个命令,但是在osx上,没有-h选项用于安装排序版本。适用于mac:du -hsx * | 排序-rn | 头-10
Yann VR

1
爱第二条命令!在我尝试过的所有工具中,最好的是-我将其保存以备后用。
CodeMouse92

清楚地详细说明了该命令+1
Harish

8

如果它们是正常文件,它将以递归方式列出文件find,并按第7个字段(这是我的输出;请检查您的大小)进行排序,并仅显示第一个文件。

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

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

一个“更好”但更复杂,更重的解决方案是find遍历目录,但也许使用stat获取有关文件的详细信息,然后也许用于awk查找最大的文件。请注意,的输出stat还取决于您的操作系统。


1
什么是+7意味着ARG要干什么?在我的机器上,sort抱怨说找不到文件+7
沙丘2012年

@Dunes-正如我所说,请检查sort系统上的手册页。 目前,我使用的是OS X 10.4,其使用源自FreeBSD的排序方式sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]...注意+POS [-POS2]。这也适用于当前版本的FreeBSD。
ghoti 2012年

2
似乎您对我有一个不同的排序程序。这是我的排序程序的手册页-linux.die.net/man/1/sort为了在我的机器上运行,您需要显式使用-karg eg。sort -k 7。编辑:由OSX 10.5排序的手册页似乎已更改为我的版本。
沙丘2012年

1
@Dunes-全部都是GNU排序,但是版本不同。该[+POS1] [-POS2]表示法只是较旧的一种。据我所知,现代GNU排序仍然支持该表示法,尽管现在看来,它似乎已从5.1版本左右的排序手册页中删除。您可以在手册页中看到有关FreeBSD 4.11的信息。我想自从FreeBSD 5.0发布以来,我还没有读过sort的手册页!
ghoti 2012年

另外,请注意,+POS1排序参数从零开始-k POS1计数,而从1开始计数。
ghoti 2012年

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的默认行为是在列中列出文件(即每行几个条目),因此第一个并不能完全找到最大的文件。关于第二个命令,它仅在给定目录中找到最大的文件,而不在其子目录中找到。
沙丘2012年

@Dunes:您是正确的,第一个命令可以找到目录,但不是由于默认行为ls。在我的测试中,该-S标志将每行列出一个文件。我已经纠正了第二条命令。希望现在它是完全可靠的。谢谢。
史蒂夫

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下可以正常工作,因为find的-printf选项在OSX / BSD上不存在,并且stat根据OS具有不同的参数。但是,第二条在OSX / BSD上正常运行的命令(sort没有-h),请sort从安装coreutils-h从中删除lssort -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),它将在目录中打印最大的文件。



0

该脚本简化了查找最大文件以采取进一步措施的过程。我将其保存在〜/ bin目录中,并将〜/ bin放入$ PATH中。

#!/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


0

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

sudo du -xm / | 排序-rn | 更多


0

列出文件夹中的较大文件

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

的输出ls -sh是文件大小编号的大小sh易于理解的视图。

您可以使用ls -shS /pathFolder | head -n 1。更大的S距离ls已经下令从较大的文件的列表中较小的,但第一个结果该文件夹中的所有文件的总和。因此,如果您只想列出一个较大的文件,则需要head -n 2检查“第二行结果”或将第一个示例与一起使用ls sort head


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.