Bash - How to find the largest file in a directory and its subdirectories?
我们刚开始一个Unix课程,正在学习各种bash命令。我们的分配涉及到对一个目录执行各种命令,该目录下也有许多文件夹。
我知道如何列出和计算根文件夹中的所有常规文件,使用:
1 | find . -type l | wc -l |
但我想知道从那里去哪里才能找到整个目录中最大的文件。我见过一些关于
请原谅,如果我的"行话"不正确,我还是会习惯的!
引用此链接-
If you want to find and print the top 10 largest files names (not
directories) in a particular directory and its sub directories
$ find . -printf '%s %p
'|sort -nr|headTo restrict the search to the present directory use"-maxdepth 1" with
find.
$ find . -maxdepth 1 -printf '%s %p
'|sort -nr|headAnd to print the top 10 largest"files and directories":
$ du -a . | sort -nr | head ** Use"head -n X" instead of the only"head" above to print the top X largest files (in all the above examples)
要在当前目录及其子目录中查找前25个文件:
这将通过"sort-nr-k5"piped命令根据文件大小排序,输出前25个文件。
相同,但具有人类可读的文件大小:
1 | find . -type f | xargs ls -lS | head -n 1 |
输出
1 | -rw-r--r-- 1 nneonneo staff 9274991 Apr 11 02:29 ./devel/misc/test.out |
如果只需要文件名:
1 | find . -type f | xargs ls -1S | head -n 1 |
这样可以避免使用
警告。因为
如果文件是普通文件,它会递归地列出文件,按第7个字段排序(这是我的
1 | find . -type f -ls | sort +7 | head -1 |
一个"更好"但更复杂和更重的解决方案是让
在linux/unix/bsd文件系统上,没有简单的命令来查找最大的文件/目录。但是,结合以下三个命令(使用管道),您可以很容易地找到最大文件的列表:
1 | # du -a /var | sort -n -r | head -n 10 |
如果您想要更多的可读输出,请尝试:
1 2 | $ cd /path/to/some/var $ du -hsx * | sort -rh | head -10 |
在哪里?
- var是要搜索的目录
- du命令-h选项:以人可读格式显示大小(例如,1k,234m,2g)。
- du命令-s选项:只显示每个命令的总数参数(摘要)。
- du命令-x选项:跳过上的目录不同的文件系统。
- sort命令-r选项:反转结果比较。
- sort命令-h选项:比较可读性数字。这只是GNU特定排序选项。
- head命令-10或-n 10选项:显示前10行。
这将在当前工作目录中找到最大的文件或文件夹:
1 | ls -S /path/to/folder | head -1 |
要查找所有子目录中最大的文件:
1 | find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /,""); print }' |
在我使用的Solaris上:
1 | find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted |
或
1 | find . -type f -ls | sort -nrk7 | head -1 #unformatted |
因为这里贴的其他东西都不管用。这将在
尝试以下一行(显示前20个最大的文件):
1 | ls -1Rs | sed -e"s/^ *//" | grep"^[0-9]" | sort -nr | head -n20 |
或(人类可读大小):
1 | ls -1Rhs | sed -e"s/^ *//" | grep"^[0-9]" | sort -hr | head -n20 |
Works fine under Linux/BSD/OSX in comparison to other answers, as find's
-printf option doesn't exist on OSX/BSD andstat has different parameters depending on OS. However the second command to work on OSX/BSD properly (assort doesn't have-h ), installsort fromcoreutils or remove-h fromls and usesort -nr instead.
所以这些别名在RC文件中很有用:
1 2 | alias big='du -ah . | sort -rh | head -20' alias big-files='ls -1Rhs | sed -e"s/^ *//" | grep"^[0-9]" | sort -hr | head -n20' |
尝试以下命令:
1 2 | find /your/path -printf"%k %p " | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024"MB""" $2 }' |tail -n 1 |
这将打印最大的文件名和大小,超过500m。您可以移动
Linux解决方案:例如,您希望根据文件/文件夹大小(降序)查看主目录(/)的所有文件/文件夹列表。
sudo du-xm/排序-rn更多
或
1 | ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max"\t" ff;}' |
列出文件夹中较大的文件
1 | ls -sh /pathFolder | sort -rh | head -n 1 |
你可以使用
这是非常简单的方法:
1 | ls -l | tr -s"""" | cut -d"" -f 5,9 | sort -n -r | head -n 1*** |
你会得到这个:
此脚本简化了查找最大文件以进行进一步操作。我把它保存在我的~/bin目录中,并把~/bin放在我的$path中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #!/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 |