递归查找最大文件

use*_*571 44 bash shell-script recursive

我试图递归地在目录中找到最大的文件。如果该目录中有一个子目录,则该函数需要进入该目录并检查是否存在最大的文件。找到最大文件后,输出将显示相对路径名以及最大文件的名称和大小。

前任:

dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的:

#!/bin/sh
clear

recursiveS() {
    for d in *; do
        if [ -d $d ]; then
            (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
        fi
    done
}
recursiveS
Run Code Online (Sandbox Code Playgroud)

我已经被困了一段时间了。我无法通过流水线化一些现有的 Unix 工具来实现这一点。任何想法都会很好!

gle*_*man 62

使用find(此处假设为 GNU find)以输出文件大小的文件名。种类。打印出最大的一个。

find . -type f -printf "%s\t%p\n" | sort -n | tail -1
Run Code Online (Sandbox Code Playgroud)

假设文件路径不包含换行符。


bash在 GNU 实现中使用循环stat

shopt -s globstar
max_s=0
for f in **; do
  if [[ -f "$f" && ! -L "$f" ]]; then
    size=$( stat -c %s -- "$f" )
    if (( size > max_s )); then
      max_s=$size
      max_f=$f
    fi
  fi
done
echo "$max_s $max_f"
Run Code Online (Sandbox Code Playgroud)

这将比 find 解决方案慢得多。这也假设文件名不以换行符结尾,并且将跳过隐藏文件而不进入隐藏目录。

如果-当前目录中有一个文件被调用,则将考虑在 stdin 上打开的文件的大小。

请注意bash4.3 之前的版本在目录树下降时遵循符号链接。

  • 我确定还有其他方法可以做到。UNIX 的理念是工具应该是单一用途的,并将它们链接在一起,以便将一个命令的输出馈送到下一个命令的输入中。 (2认同)
  • @user2419571:`tail -n 1 <(sort -n <(find .-type f -printf "%s\t%p\n"))` ;) (2认同)

小智 11

此命令也有助于列出定义的大小。

find . -type f -size +100M -exec ls -lh {} \;
Run Code Online (Sandbox Code Playgroud)


CeD*_*ROM 6

这适用于 BSD/macOS 并使用快速但非 POSIX 的实用程序-ls扩展find

find . -type f -ls | sort -k7 -r | head -n 3
Run Code Online (Sandbox Code Playgroud)

这速度较慢,但​​可能适用于以下-ls扩展不可用的POSIX 系统find

find . -type f -exec ls -al {} \; | sort -k5 -r | head -n3
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  • find 是一个强大的文件搜索实用程序,它将根据下面解释的给定查询向您显示结果。
  • find . 将在当前工作目录中搜索。
  • find . -type f 将仅搜索指定的文件类型“f”,即常规文件(这意味着它将跳过目录、特殊文件、链接、套接字等)。
  • -ls开关将指示find显示有关找到的文件的完整信息。但是,根据 BSD 系统上的 man 的说法,它是 IEEE Std 1003.1-2001(“POSIX.1”)标准的扩展,可能并非在所有平台上都可用。
  • 或者,如果-ls您的系统上没有扩展名,您可以-exec .. {} \;使用ls -al命令并使用第 5 个字段对结果进行排序。{}表示已找到的文件名。\;包含-exec命令。
  • |Unix 符号的意思是“管道”,它将一个程序的输出重定向到另一个程序的输入。它将find程序输出文本作为输入发送到sort程序。
  • sort是一个排序实用程序。它获取数据行,然后将这些行按升序排序作为结果。
  • sort -k7表示取第 7 个字段作为排序参数值。参数由空格分隔。第 7 个参数是find实用程序生成的文件大小。如果您使用-exec ls -al {} \;而不是,-ls那么您将使用第 5 个字段-k5进行排序。
  • -r告诉sort使用最大的反向排序。因为我们想先查看最大的文件。
  • 此外,如果您真的不想看到成百上千的行,您还可以通过管道 ( |) 将排序的输出发送到head实用程序,该实用程序将只显示-n 3结果输出的前三行(按照 指示)。

长话短说:find用于查找递归常规文件,仅在当前工作目录中开始搜索,然后使用-ls扩展名(或执行ls -al)显示有关该文件的完整信息。稍后将结果从findtosort使用 unix pipe传递,|并根据第 7 个(或第 5 个)字段将其排序为最大。此外,您可以n使用head实用程序将结果限制为行。

我的意思是“使用brainz”让您阅读“男人”并自己离线搜索解决方案,这将训练您从头开始解决问题:-)