Rek*_*son 98 directory bash file find large-files
我们刚刚开始一个UNIX类,正在学习各种Bash命令.我们的任务涉及在一个目录下执行各种命令,该目录下面还有许多文件夹.
我知道如何使用以下方法列出和计算根文件夹中的所有常规文件:
find . -type l | wc -l
Run Code Online (Sandbox Code Playgroud)
但是我想知道从那里去哪里才能找到整个目录中最大的文件.我见过一些关于du命令的事情,但是我们还没有学到这一点,所以在我们学到的所有东西中,我认为我们需要以某种方式将它连接到ls -t命令.
请原谅我,如果我的'行话'不正确,我仍然习惯它!
tam*_*ler 125
从这个链接引用 -
如果要查找并打印特定目录及其子目录中的前10个最大文件名(而不是目录)
$ find . -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最大的文件(在上面的所有示例中)
xpr*_*ros 59
要查找当前目录及其子目录中的前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
nne*_*neo 10
find . -type f | xargs ls -lS | head -n 1
Run Code Online (Sandbox Code Playgroud)
输出
-rw-r--r-- 1 nneonneo staff 9274991 Apr 11 02:29 ./devel/misc/test.out
Run Code Online (Sandbox Code Playgroud)
如果你只想要文件名:
find . -type f | xargs ls -1S | head -n 1
Run Code Online (Sandbox Code Playgroud)
这避免了使用awk并允许您使用您想要的任何标志ls.
警告.因为xargs尝试避免构建过长的命令行,如果在包含大量文件的目录上运行它,则可能会失败,因为ls最终会执行多次.这不是一个不可克服的问题(您可以head -n 1从每次ls调用中收集输出,然后ls -S再次运行,循环直到您拥有单个文件),但它确实在某种程度上损害了这种方法.
如果它们是普通文件,则按递归方式列出文件,按第7个字段排序(find输出中的大小;检查你的文件),并仅显示第一个文件.
find . -type f -ls | sort +7 | head -1
Run Code Online (Sandbox Code Playgroud)
第一个选项find是递归搜索的起始路径.A类f搜索普通文件.请注意,如果您尝试将其解析为文件名,则如果文件名包含空格,换行符或其他特殊字符,则可能会失败.选项sort也因操作系统而异.我正在使用FreeBSD.
一个"更好"但更复杂和更重的解决方案是find遍历目录,但可能用于stat获取有关文件的详细信息,然后可能用于awk查找最大的大小.请注意,输出stat还取决于您的操作系统.
没有简单的命令可以找到Linux/UNIX/BSD文件系统上最大的文件/目录.但是,结合以下三个命令(使用管道),您可以轻松找到最大文件列表:
# du -a /var | sort -n -r | head -n 10
Run Code Online (Sandbox Code Playgroud)
如果您想要更多人类可读输出,请尝试:
$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10
Run Code Online (Sandbox Code Playgroud)
哪里,
这将找到当前工作目录中最大的文件或文件夹:
ls -S /path/to/folder | head -1
Run Code Online (Sandbox Code Playgroud)
要查找所有子目录中的最大文件:
find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'
Run Code Online (Sandbox Code Playgroud)