Bash – 如何find目录及其子目录中最大的文件?

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

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

find . -type l | wc -l 

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

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

从这个链接引用 –

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

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

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

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

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

$ du -a . | sort -nr | head

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

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

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

这将通过“sort -nr -k5”pipe道命令通过基于文件大小进行sorting来输出前25个文件。

 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试图避免构build超长的命令行,所以如果你在一个有很多文件的目录上运行它,可能会失败,因为ls最终会执行多次。 这不是一个不可克服的问题(你可以从每个ls调用收集head -n 1输出,并再次运行ls -S ,循环直到你有一个文件),但是它确实有点违背了这个方法。

这是recursion列出的文件,如果他们是正常的文件,按7字段sorting(这是在我的find输出的大小;检查你的),并只显示第一个文件。

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

第一个find选项是recursionsearch的开始path。 f一个typessearch正常的文件。 请注意,如果试图将其parsing为文件名,如果文件名包含空格,换行符或其他特殊字符,则可能会失败。 sort选项也因操作系统而异。 我正在使用FreeBSD。

一个“更好”,但更复杂和更重的解决scheme将是find遍历的目录,但也许使用stat来获得有关该文件的详细信息,然后可能使用awkfind最大的大小。 请注意stat的输出也取决于您的操作系统。

没有简单的命令可以findLinux / UNIX / BSD文件系统上最大的文件/目录。 但是,以下三个命令(使用pipe道)的组合,你可以很容易地find最大的文件列表:

 # du -a /var | sort -n -r | head -n 10 

如果你想要更多的人类可读的输出尝试:

 $ cd /path/to/some/var $ du -hsx * | sort -rh | head -10 

哪里,

  • Var是您要search的目录
  • du命令-h选项:以可读格式显示大小(例如,1K,234M,2G)。
  • du命令-s选项:仅显示每个参数的总数(摘要)。
  • du命令-x选项:跳过不同文件系统上的目录。
  • sorting命令-r选项:反转比较的结果。
  • sorting命令-h选项:比较人类可读的数字。 这只是GNUsorting特定的选项。
  • 头部命令-10 OR -n 10选项:显示前10行。

这将在您当前的工作目录中find最大的文件或文件夹:

 ls -S /path/to/folder | head -1 

要find所有子目录中最大的文件:

 find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }' 

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

尝试以下一行(显示前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根据OS具有不同的参数。 然而,第二个命令适当地在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' 

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

要么

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

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

sudo du -xm / | sort -rn | 更多

尝试下面的命令:

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

该脚本简化了查找最大文件的进一步操作。 我把它保存在我的〜/ 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 

这是很简单的方法来做到这一点:

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

你会得到这个: 8445 examples.desktop