我们刚刚开始UNIX类,并且正在学习各种Bash命令。我们的工作涉及在目录下执行各种命令,该目录下还包含许多文件夹。
我知道如何使用以下方法列出和计数根文件夹中的所有常规文件:
find . -type l | wc -l
但是我想知道从那里去哪里才能找到整个目录中最大的文件。我已经看到了有关du
命令的一些信息,但是我们还没有学到,所以在我们学到的所有命令中,我认为我们需要以某种方式将其连接到ls -t
命令。
如果我的“行话”不正确,请原谅我,我仍然会习惯它!
我们刚刚开始UNIX类,并且正在学习各种Bash命令。我们的工作涉及在目录下执行各种命令,该目录下还包含许多文件夹。
我知道如何使用以下方法列出和计数根文件夹中的所有常规文件:
find . -type l | wc -l
但是我想知道从那里去哪里才能找到整个目录中最大的文件。我已经看到了有关du
命令的一些信息,但是我们还没有学到,所以在我们学到的所有命令中,我认为我们需要以某种方式将其连接到ls -t
命令。
如果我的“行话”不正确,请原谅我,我仍然会习惯它!
Answers:
引用自这个链路
如果要查找并打印特定目录及其子目录中的前10大文件名(而非目录)
$ find . -printf '%s %p\n'|sort -nr|head
要将搜索限制为当前目录,请在查找中使用“ -maxdepth 1”。
$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head
并打印出前十个最大的“文件和目录”:
$ du -a . | sort -nr | head
**使用“ head -n X”代替上面的唯一“ head”来打印头X个最大的文件(在上述所有示例中)
'%s %p\n'
与'%p\n'
和添加|xargs ls -lh
到年底
du -am . | sort -nr | grep '\..*\.' | head
。的m
是在显示兆字节的文件大小和用于grep
向显示线与至少两个点,第一个是在./
路径中,第二个是在文件扩展名,例如.mov
。
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
再次运行,循环直到只有一个文件为止),但是确实会破坏这种方法。
xargs
,我忽略了+1
find . -type f -print0 | xargs -0 ls -lS | head -n 1
xargs
执行的文件中找到最大的文件。要解决此问题,请添加排序:find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10
。为我工作过OSX。
没有简单的命令可以找到Linux / UNIX / BSD文件系统上最大的文件/目录。但是,结合以下三个命令(使用管道),您可以轻松找到最大文件列表:
# du -a /var | sort -n -r | head -n 10
如果您想要更多人类可读的输出,请尝试:
$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10
哪里,
如果它们是正常文件,它将以递归方式列出文件find
,并按第7个字段(这是我的输出;请检查您的大小)进行排序,并仅显示第一个文件。
find . -type f -ls | sort +7 | head -1
第一个选项find
是递归搜索的起始路径。f
搜索普通文件的一种类型。请注意,如果您尝试将其解析为文件名,则如果文件名包含空格,换行符或其他特殊字符,则可能会失败。选项sort
也因操作系统而异。我正在使用FreeBSD。
一个“更好”但更复杂,更重的解决方案是find
遍历目录,但也许使用stat
获取有关文件的详细信息,然后也许用于awk
查找最大的文件。请注意,的输出stat
还取决于您的操作系统。
+7
意味着ARG要干什么?在我的机器上,sort抱怨说找不到文件+7
。
sort
系统上的手册页。 目前,我使用的是OS X 10.4,其使用源自FreeBSD的排序方式:sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]
...注意+POS [-POS2]
。这也适用于当前版本的FreeBSD。
-k
arg eg。sort -k 7
。编辑:由OSX 10.5排序的手册页似乎已更改为我的版本。
[+POS1] [-POS2]
表示法只是较旧的一种。据我所知,现代GNU排序仍然支持该表示法,尽管现在看来,它似乎已从5.1版本左右的排序手册页中删除。您可以在手册页中看到有关FreeBSD 4.11的信息。我想自从FreeBSD 5.0发布以来,我还没有读过sort的手册页!
+POS1
排序参数从零开始-k POS1
计数,而从1开始计数。
这将在您当前的工作目录中找到最大的文件或文件夹:
ls -S /path/to/folder | head -1
要在所有子目录中找到最大的文件:
find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'
ls
。在我的测试中,该-S
标志将每行列出一个文件。我已经纠正了第二条命令。希望现在它是完全可靠的。谢谢。
尝试以下一类代码(显示前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
根据OS具有不同的参数。但是,第二条在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'
该脚本简化了查找最大文件以采取进一步措施的过程。我将其保存在〜/ 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
1***
应该在到底要干什么?我收到该参数的“找不到匹配项”错误。
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
man
您感兴趣的命令后键入。Up将为该命令弹出一个不错的手动输入项(按q
返回至命令行)。