112

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

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

find . -type l | wc -l

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

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

4

16 回答 16

131

从此链接引用-

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

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

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

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

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

$ du -a . | sort -nr | head

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

于 2012-09-20T23:21:11.683 回答
68

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

于 2014-05-29T03:42:29.970 回答
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再次运行,循环直到您有一个文件),但它确实在某种程度上破坏了这种方法。

于 2012-09-21T03:45:03.397 回答
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 命令 -h 选项:以人类可读的格式显示大小(例如,1K、234M、2G)。
  • du 命令 -s 选项:仅显示每个参数的总数(摘要)。
  • du 命令 -x 选项:跳过不同文件系统上的目录。
  • 排序命令 -r 选项:反转比较结果。
  • 排序命令 -h 选项:比较人类可读的数字。这只是 GNU 排序特定的选项。
  • head 命令 -10 或 -n 10 选项:显示前 10 行。
于 2014-05-26T09:34:26.173 回答
9

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

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

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

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

于 2012-09-20T23:20:50.657 回答
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 }'
于 2012-09-20T23:21:01.660 回答
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和子目录中找到最大的文件。

于 2013-10-13T22:33:18.040 回答
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),它将打印目录中最大的文件。

于 2012-09-21T03:23:36.600 回答
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根据操作系统具有不同的参数。但是,要在 OSX/BSD 上正常工作的第二个命令(因为sort没有-h),sort从安装coreutils或删除-h并改为ls使用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'
于 2015-03-05T12:34:35.823 回答
1

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

或者

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

于 2012-09-20T23:33:06.723 回答
1

列出文件夹中较大的文件

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

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

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

于 2018-03-08T01:14:45.957 回答
1

这个命令对我有用,

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

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

于 2021-07-26T19:07:15.210 回答
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
于 2014-01-22T07:41:24.897 回答
0

这是非常简单的方法:

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

你会得到这个:8445 examples.desktop

于 2014-03-14T07:40:40.450 回答
0

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

须藤杜-xm / | 排序-rn | 更多的

于 2017-03-03T21:05:14.683 回答
0
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
于 2019-01-11T16:34:22.470 回答