我们刚刚开始上 UNIX 课程,并且正在学习各种 Bash 命令。我们的任务涉及在一个目录下执行各种命令,该目录下也有许多文件夹。
我知道如何使用以下方法列出和计算根文件夹中的所有常规文件:
find . -type l | wc -l
但我想知道从那里去哪里才能找到整个目录中最大的文件。我见过一些关于du
命令的东西,但我们还没有学到这一点,所以在我们学到的所有东西中,我假设我们需要以某种方式将它连接到ls -t
命令。
如果我的“术语”不正确,请原谅我,我还在习惯它!
我们刚刚开始上 UNIX 课程,并且正在学习各种 Bash 命令。我们的任务涉及在一个目录下执行各种命令,该目录下也有许多文件夹。
我知道如何使用以下方法列出和计算根文件夹中的所有常规文件:
find . -type l | wc -l
但我想知道从那里去哪里才能找到整个目录中最大的文件。我见过一些关于du
命令的东西,但我们还没有学到这一点,所以在我们学到的所有东西中,我假设我们需要以某种方式将它连接到ls -t
命令。
如果我的“术语”不正确,请原谅我,我还在习惯它!
从此链接引用-
如果要查找并打印特定目录及其子目录中的前 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 个最大的文件(在上述所有示例中)
在当前目录及其子目录中查找前 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
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
再次运行,循环直到您有一个文件),但它确实在某种程度上破坏了这种方法。
没有简单的命令可用于找出 Linux/UNIX/BSD 文件系统上最大的文件/目录。但是,结合以下三个命令(使用管道),您可以轻松找到最大文件的列表:
# du -a /var | sort -n -r | head -n 10
如果您想要更多人类可读的输出,请尝试:
$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10
在哪里,
如果文件是普通文件,这将递归列出文件,按第 7 个字段排序(这是我的find
输出中的大小;检查你的),并只显示第一个文件。
find . -type f -ls | sort +7 | head -1
第一个选项find
是递归搜索的开始路径。A 类f
搜索普通文件。请注意,如果您尝试将其解析为文件名,则如果文件名包含空格、换行符或其他特殊字符,您可能会失败。选项sort
也因操作系统而异。我正在使用 FreeBSD。
一个“更好”但更复杂和更重find
的解决方案是遍历目录,但可能用于stat
获取有关文件的详细信息,然后可能用于awk
查找最大大小。请注意, 的输出stat
还取决于您的操作系统。
这将在您当前的工作目录中找到最大的文件或文件夹:
ls -S /path/to/folder | head -1
要在所有子目录中查找最大的文件:
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 /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)
,它将打印目录中最大的文件。
尝试以下单行(显示前 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'
du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1
或者
du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'
列出文件夹中较大的文件
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
.
这个命令对我有用,
find /path/to/dir -type f -exec du -h '{}' + | sort -hr | head -10
以人类可读模式列出按大小排序的前 10 个文件。
此脚本简化了查找最大文件以供进一步操作。我将它保存在我的 ~/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 解决方案:例如,您想根据文件/文件夹大小(降序)查看主(/)目录的所有文件/文件夹列表。
须藤杜-xm / | 排序-rn | 更多的
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'