我们刚刚开始一个UNIX类,正在学习各种Bash命令。我们的任务涉及在一个目录下执行各种命令,该目录下面还有许多文件夹。
我知道如何使用以下方法列出和计算根文件夹中的所有常规文件:
find . -type l | wc -l
但是我想知道从那里去哪里才能找到整个目录中最大的文件。我见过关于du
命令的事情,但是我们还没有学到这一点,所以在我们学到的所有内容中我假设我们需要以某种方式将它连接到ls -t
命令。 / p>
请原谅我,如果我的'行话'不正确,我还是会习惯它!
答案 0 :(得分:118)
引自this链接 -
如果要查找并打印前10个最大的文件名(不是 目录)在特定目录及其子目录
中
$ find . -printf '%s %p\n'|sort -nr|head
要将搜索限制到当前目录,请使用“-maxdepth 1” 找到。
$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head
打印前10大“文件和目录”:
$ du -a . | sort -nr | head
**使用“head -n X”代替上面唯一的“head”来打印最大的X个最大文件(在上面的所有例子中)
答案 1 :(得分:57)
要查找当前目录及其子目录中的前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
答案 2 :(得分: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
,循环直到您拥有单个文件),但它确实存在这种做法有点过分。
答案 3 :(得分:8)
如果文件是普通文件,则按递归方式列出文件,按第7个字段排序(这是我find
输出中的大小;检查你的文件),并只显示第一个文件。
find . -type f -ls | sort +7 | head -1
find
的第一个选项是递归搜索的起始路径。 A型f
搜索普通文件。请注意,如果您尝试将其解析为文件名,则如果文件名包含空格,换行符或其他特殊字符,则可能会失败。 sort
的选项也因操作系统而异。我正在使用FreeBSD。
“更好”但更复杂,更重的解决方案是让find
遍历目录,但也许使用stat
来获取有关文件的详细信息,然后使用awk
找到最大的尺寸。请注意,stat
的输出还取决于您的操作系统。
答案 4 :(得分:7)
没有简单的命令可以找到Linux / UNIX / BSD文件系统上最大的文件/目录。但是,结合以下三个命令(使用管道),您可以轻松找到最大文件列表:
# du -a /var | sort -n -r | head -n 10
如果您想要更多人类可读输出,请尝试:
$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10
其中,
答案 5 :(得分: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 }'
答案 6 :(得分:3)
在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
和子目录中的最大文件。
答案 7 :(得分: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下与其他答案相比可以正常工作,因为OSX / BSD上不存在find
-printf
选项,stat
根据操作系统有不同的参数。但是正确处理OSX / BSD的第二个命令(sort
没有-h
),从sort
安装coreutils
或从-h
删除ls
{1}}并改为使用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'
答案 8 :(得分:1)
du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1
或
du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'
答案 9 :(得分:1)
Linux解决方案:例如,您希望根据文件/文件夹大小(降序)查看主目录(/)的所有文件/文件夹列表。
sudo du -xm / | sort -rn |更
答案 10 :(得分: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
答案 11 :(得分:0)
这是一种非常简单的方法:
ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***
你会得到这个:8445 examples.desktop
答案 12 :(得分:0)
列出文件夹中的较大文件
ls -sh /pathFolder | sort -rh | head -n 1
ls -sh
的输出是文件大小编号的大小s
和人类h
可理解的视图。
您可以使用ls -shS /pathFolder | head -n 1
。来自S
的较大ls
已将列表从较大的文件排序为较小的文件,但第一个结果是该文件夹中所有文件的总和。因此,如果您只想列出较大的文件,一个文件,则需要head -n 2
并检查&#34;第二行结果&#34;或者使用ls sort head
的第一个示例。
答案 13 :(得分:0)
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
答案 14 :(得分:0)
这个命令对我有用,
<块引用>find /path/to/dir -type f -exec du -h '{}' + | sort -hr | head -10
以人类可读模式列出按大小排序的前 10 个文件。