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

时间:2012-09-20 23:15:26

标签: file bash directory find large-files

我们刚刚开始一个UNIX类,正在学习各种Bash命令。我们的任务涉及在一个目录下执行各种命令,该目录下面还有许多文件夹。

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

find . -type l | wc -l

但是我想知道从那里去哪里才能找到整个目录中最大的文件。我见过关于du命令的事情,但是我们还没有学到这一点,所以在我们学到的所有内容中我假设我们需要以某种方式将它连接到ls -t命令。 / p>

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

15 个答案:

答案 0 :(得分:118)

引自this链接 -

  

如果要查找并打印前10个最大的文件名(不是   目录)在特定目录及其子目录

中      

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

     

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

     

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

     

打印前10大“文件和目录”:

     

$ du -a . | sort -nr | head

     

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

答案 1 :(得分:57)

要查找当前目录及其子目录中的前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

答案 2 :(得分: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,循环直到您拥有单个文件),但它确实存在这种做法有点过分。

答案 3 :(得分:8)

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

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

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

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

答案 4 :(得分:7)

没有简单的命令可以找到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选项:跳过目录 不同的文件系统。
  • 排序命令-r选项:反转结果 比较。
  • 排序命令-h选项:比较人类可读 数字。这只是GNU排序特定选项。
  • 头部命令-10或-n 10选项:显示前10行。

答案 5 :(得分: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 }'

答案 6 :(得分:3)

在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和子目录中的最大文件。

答案 7 :(得分: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),从sort安装coreutils或从-h删除ls {1}}并改为使用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'

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

sudo du -xm / | sort -rn |更

答案 10 :(得分: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

答案 11 :(得分:0)

这是一种非常简单的方法:

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

你会得到这个:8445 examples.desktop

答案 12 :(得分:0)

列出文件夹中的较大文件

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

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

您可以使用ls -shS /pathFolder | head -n 1。来自S的较大ls已将列表从较大的文件排序为较小的文件,但第一个结果是该文件夹中所有文件的总和。因此,如果您只想列出较大的文件,一个文件,则需要head -n 2并检查&#34;第二行结果&#34;或者使用ls sort head的第一个示例。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

这个命令对我有用,

<块引用>

find /path/to/dir -type f -exec du -h '{}' + | sort -hr | head -10

以人类可读模式列出按大小排序的前 10 个文件。