如何找到一个目录及其子目录中最大的文件?

我们刚刚开始一个 UNIX 类,正在学习各种 Bash 命令。我们的任务包括在一个目录中执行各种命令,该目录下也有许多文件夹。

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

find . -type l | wc -l

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

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

156888 次浏览

This lists files recursively if they're normal files, sorts by the 7th field (which is size in my find output; check yours), and shows just the first file.

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

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

A "better" but more complex and heavier solution would be to have find traverse the directories, but perhaps use stat to get the details about the file, then perhaps use awk to find the largest size. Note that the output of stat also depends on your operating system.

This will find the largest file or folder in your present working directory:

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

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

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

引自 这个链接-

如果要查找和打印前10个最大的文件名(不是 目录)

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

若要将搜索限制在当前目录中,请使用“-maxdeep 1”和 find.

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

打印排名前十的“文件和目录”:

$ du -a . | sort -nr | head

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

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

或者

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

Try following command :

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1

This will print the largest file name and size and more than 500M. You can move the if($1 > 500000),and it will print the largest file in the directory.

find . -type f | xargs ls -lS | head -n 1

outputs

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

If you just want the filename:

find . -type f | xargs ls -1S | head -n 1

这样可以避免使用 awk,并允许您在 ls中使用您想要的任何标志。

警告。因为 xargs试图避免构建过长的命令行,所以如果在包含大量文件的目录中运行它,这可能会失败,因为 ls最终执行不止一次。这并不是一个无法解决的问题(您可以从每个 ls调用中收集 head -n 1输出,然后再次运行 ls -S,循环直到有一个文件) ,但是这种方法确实有些不妥。

在 Solaris 上,我使用:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

或者

find . -type f -ls | sort -nrk7 | head -1 #unformatted

because anything else posted here didn't work. 这将找到 $PWD和子目录中最大的文件。

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

没有简单的命令可用于查找 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 选项: 以人类可读格式显示的大小(例如, 1K,234M,2G).
  • Du command-s 选项: 仅显示每个命令的总数 argument (summary).
  • Du 命令-x 选项: 跳过 不同的文件系统。
  • Sort command-r 选项: 逆转结果 比较。
  • Sort command-h 选项: than human readable 数字。这是 GNU 排序专用选项。
  • Head 命令 -10 OR-n 10选项: 显示前10行。

要查找工作目录及其子目录中的前25个文件:

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

This will output the top 25 files by sorting based on the size of the files via the "sort -nr -k5" piped command.

同样,但是使用人类可读的文件大小:

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

尝试下面的一行程序(显示排名前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

Works fine under Linux/BSD/OSX in comparison to other answers, as find's -printf option doesn't exist on OSX/BSD and stat has different parameters depending on OS. However the second command to work on OSX/BSD properly (as sort doesn't have -h), install sort from coreutils or remove -h from ls and use sort -nr instead.

所以这些别名在你的 RC文件中很有用:

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

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

Sudo du-xm/| sort-rn | more

列出文件夹中较大的文件

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

ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'

这个命令对我有效,

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

Lists Top 10 files ordered by size in human-readable mode.

请运行以下一个班轮与您所需的路径。从现在起,我正在运行的 /var/log/位置

 (sudo  du -a /var/log/ |sort -nr|head -n20 |awk '{print $NF}'|while read l ;do du -csh $l|grep -vi total;done ) 2> /dev/null