【问题标题】:How to find the largest file in a directory and its subdirectories?如何在目录及其子目录中找到最大的文件?
【发布时间】:2012-09-13 09:19:40
【问题描述】:

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

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

find . -type l | wc -l

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

如果我的“行话”不正确,请原谅我,我还在习惯它!

【问题讨论】:

  • 如果您知道一个命令,但不确定如何使用它,请尝试输入man,然后输入您感兴趣的命令。Up 将为该命令弹出一个不错的手动条目(按q 返回命令行)。

标签: file bash directory find large-files


【解决方案1】:

引用this链接-

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

$ find . -type f -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 个最大的文件(在上述所有示例中)

【讨论】:

  • 为什么 "du -a . | sort -nr | head" 返回的 KB 数是实际文件大小的两倍?
  • 啊,你需要添加 'k' 选项,否则它会显示 512 字节的倍数,而不是 1024 的倍数。du -ak
  • 第一个,你如何获得人类可读格式的大小?
  • @Bluz 我会尝试用'%p\n' 替换'%s %p\n' 并在末尾添加|xargs ls -lh
  • 第一个解决方案对我来说在 OS X 上不起作用,所以我最终使用快速破解从第三个解决方案中过滤掉目录:du -am . | sort -nr | grep '\..*\.' | headm 以兆字节为单位显示文件大小,grep 显示至少有两个点的行,第一个在路径中的./ 中,第二个在文件扩展名中,例如.mov.
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    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,循环直到您有一个文件),但它确实在某种程度上破坏了这种方法。

    【讨论】:

    • 对不起xargs,我忽略了你+1
    • 处理带空格的文件名,使用find . -type f -print0 | xargs -0 ls -lS | head -n 1
    • 这会在xargs 执行的第一批中找到最大的文件。要修复它,请添加排序:find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10。为我在 OSX 上工作。
    【解决方案4】:

    没有简单的命令可用于找出 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 option : 以人类可读的格式显示尺寸(例如, 1K、234M、2G)。
    • du command -s option : 只显示每个的总数 论据(摘要)。
    • du command -x option : 跳过目录 不同的文件系统。
    • 排序命令 -r 选项: 反转结果 的比较。
    • sort 命令 -h 选项: 比较人类可读性 数字。这只是 GNU 排序特定的选项。
    • head command -10 OR -n 10 option :显示前 10 行。

    【讨论】:

    • 我更喜欢第二个命令,但在 osx 上,没有安装排序版本的 -h 选项。应该适用于 mac:du -hsx * |排序-rn |头 -10
    • 喜欢第二条命令!我试过的最好的 - 我会留着以后用。
    【解决方案5】:

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

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

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

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

    【讨论】:

    • +7 arg 是什么意思?在我的机器上排序只是抱怨它找不到名为 +7 的文件。
    • @Dunes - 正如我所说,在您的系统上查看 sort 的手册页。 I'm using OS X 10.4 at the moment, where usage derives from FreeBSD's sort: sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...] ...注意+POS [-POS2]。这也适用于当前版本的 FreeBSD。
    • 看来你对我有不同的排序程序。这是我的排序程序的手册页 -- linux.die.net/man/1/sort 要在我的机器上工作,您需要明确使用 -k 参数,例如。 sort -k 7。编辑:通过 OSX 10.5,排序的手册页似乎已更改为我拥有的版本。
    • @Dunes - 都是 GNU 排序,但版本不同。 [+POS1] [-POS2] 符号只是一个较旧的符号。据我所知,现代 GNU 排序仍然支持这种表示法,但现在看来,它似乎在 5.1 版之后从排序手册页中删除了。您可以在 sort for FreeBSD 4.11 的手册页中看到它。我想我在 FreeBSD 5.0 发布之前就没有读过 sort 的手册页了!
    • 另外,请注意+POS1 从零开始计数排序参数,而-k POS1 从一开始计数。
    【解决方案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:你是对的,第一个命令可以找到目录,但不是因为ls的默认行为。在我的测试中,-S 标志将每行列出一个文件。我已经更正了第二个命令。希望现在它是完全证明的。谢谢。
    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      尝试以下单行(显示前 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 具有不同的参数,具体取决于操作系统。然而,第二个在 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'
      

      【讨论】:

      • 这仅显示没有路径的文件名,因此并不能真正帮助找到最大的文件。
      • 对我来说,我有最大的文件,但最后这并没有给我正确的文件
      【解决方案9】:

      尝试以下命令:

      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),它会打印目录中最大的文件。

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

          【解决方案11】:

          列出文件夹中较大的文件

          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 的第一个示例。

          【讨论】:

            【解决方案12】:

            这个命令对我有用,

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

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

            【讨论】:

              【解决方案13】:

              此脚本简化了查找最大文件以供进一步操作的过程。 我将它保存在我的 ~/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
              

              【讨论】:

                【解决方案14】:

                这是一种相当简单的方法:

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

                你会得到这个:8445 examples.desktop

                【讨论】:

                • 1*** 最后应该做什么?我收到该参数的“未找到匹配项”错误。
                【解决方案15】:

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

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

                【讨论】:

                  【解决方案16】:
                  ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-08-06
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-02-13
                    • 2011-03-10
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多