如何递归扫描文件夹并按大小对内容排序?
我尝试使用
ls -R -S
,但这也列出了目录。 我也尝试使用
find
。#1 楼
您也可以仅通过du
来执行此操作。为了安全起见,我正在使用以下版本的du
:$ du --version
du (GNU coreutils) 8.5
方法:
$ du -ah ..DIR.. | grep -v "/$" | sort -rh
方法的分解
命令
du -ah DIR
将产生一个给定目录DIR
中所有文件和目录的列表。 -h
会产生我喜欢的人类可读尺寸。如果您不希望它们,请放弃该开关。我使用head -6
只是为了限制输出量!$ du -ah ~/Downloads/ | head -6
4.4M /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M /home/saml/Downloads/kodak_W820_wireless_frame
8.0K /home/saml/Downloads/bugs.xls
604K /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf
很容易将其最小到最大排序: />
$ du -ah ~/Downloads/ | sort -h | head -6
0 /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0 /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock
不显示目录,仅显示文件:
$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G /home/saml/Downloads/digital_blasphemy
如果要从输出中排除所有目录,可以使用带有点号的技巧字符。这假设您的目录名称不包含点,并且您要查找的文件也包含点。然后,您可以使用
grep -v '\s/[^.]*$'
过滤掉目录: -r
代替tail -6
。$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6
3.8G /home/saml/Downloads/audible/audio_books
3.8G /home/saml/Downloads/audible
2.3G /home/saml/Downloads/apps_archive
1.5G /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G /home/saml/Downloads/digital_blasphemy
835M /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
评论
grep -v“ / $”部分似乎没有按预期执行操作,因为目录未附加斜杠。有谁知道如何从结果中排除目录?
– JanWarchoł
2015年2月16日在10:14
@JanekWarchol-顺带一提,要省略目录,您必须更改策略,并使用find仅生成文件列表,然后对其进行正式计算。
–slm♦
15年2月16日在14:50
这也发现了迪尔斯
– ekerner
17年8月17日在22:29
这不仅列出文件,还列出目录:(
–罗马·高夫曼
18-2-26在21:09
基于该解决方案以及本文中提供的解决方案:unix.stackexchange.com/questions/22432/…,我仅使用以下命令即可对文件产生结果:find。型f -exec du -ah {} + | grep -v“ / $” |排序-rh
–flochtililoch
20-4-16在1:12
#2 楼
如果要使用GNUfind
在当前目录及其子目录中查找所有文件,并根据文件大小(不考虑其路径)列出它们,并假设文件名都不包含换行符,则可以执行以下操作: br /> find . -type f -printf "%s\t%p\n" | sort -n
来自GNU系统上的
man find
: -printf format
True; print format on the standard output,
interpreting `\' escapes and `%' directives.
Field widths and precisions can be specified
as with the `printf' C function. Please note
that many of the fields are printed as %s
rather than %d, and this may mean that flags
don't work as you might expect. This also
means that the `-' flag does work (it forces
fields to be left-aligned). Unlike -print,
-printf does not add a newline at the end of
the string. The escapes and directives are:
%p File's name.
%s File's size in bytes.
来自
man sort
: > -n, --numeric-sort
compare according to string numerical value
评论
不幸的是,它在Mac上不起作用,显示:查找:-printf:未知的主要或运算符
–罗马·高夫曼
18-2-26在21:09
@RomanGaufman是的,这就是答案指定GNU查找的原因。如果您在Mac上安装了GNU工具,它也将在那里工作。
– terdon♦
18-2-26在21:33
#3 楼
请尝试以下命令:ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20
它将递归列出当前目录中的前20个最大文件。
注意:选项
-h
for sort
在OSX / BSD上不可用,因此您必须从sort
安装coreutils
(例如通过brew
),并将本地bin路径应用于PATH
,例如>或者使用:
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
对于最大的目录,请使用
du
,例如: > or:ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20
评论
完美,这是第一个可在Mac上运行且不显示目录的解决方案:)-谢谢!
–罗马·高夫曼
18-2-26在21:20
如何过滤以仅显示行数> = X的文件? (例如X = 0)
–矩阵
19年5月1日在15:24
#4 楼
这将以递归方式查找所有文件,并按大小对其进行排序。它打印出所有文件大小(以kb为单位),并四舍五入,因此您可能会看到0 KB文件,但是它足够接近我的使用,并且可以在OSX上使用。评论
也可以在Ubuntu 14.04上工作!
–林大伟
16年7月22日在22:12
这列出了目录,而不仅仅是文件:(
–罗马·高夫曼
18-2-26在21:11
@RomanGaufman-感谢您的反馈!从我的测试中找到。 -type f查找文件...它是递归工作的,您是对的,但是它列出了找到的所有文件,而不是目录本身
–布拉德公园
18-2-27在12:44
Xargs已在1980年代使用。自1989年David Korn引入execplus以来,这是一个坏主意。
–schily
18年6月15日在8:21
#5 楼
使用zsh
时,您将找到最大的文件(就外观大小而言,如ls -l
输出中的size列,而不是磁盘使用情况),其中:ls -ld -- **/*(DOL[1])
最大的文件:
ls -ld -- **/*(DOL[1,6])
要按文件大小排序,可以使用
ls
的-S
选项。一些ls
实现还为-U
提供了一个ls
选项,用于不对列表进行排序(因为此处已经按大小按zsh
对列表进行了排序)。#6 楼
Mac / Linux跳过目录的简单解决方案:find . -type f -exec du -h {} \; | sort -h
#7 楼
BSD
或OSX
中的等效项是$ du -ah simpl | sort -dr | head -6
#8 楼
尝试使用带有排序选项的以下命令使文件夹的大小按升序排列du -sh * | sort -sh
评论
不需要-s排序。要么?
– Mircealungu
20年3月13日在22:37
#9 楼
由于各种原因,这是一个令人难以置信的共同需求(我喜欢在目录中找到最新的备份),并且是一个非常简单的任务。我将提供一个使用find的Linux解决方案xargs ,stat,tail,awk和sort实用程序。
大多数人提供了一些独特的答案,但我更喜欢我的,因为它可以正确处理文件名,并且用例可以轻松更改(修改stat和sort参数)
我还将提供一个Python解决方案,即使在Windows上也应允许您使用此功能。 />
find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n
和以前一样,但是这次返回最大的文件。
# Each utility is split on a new line to help
# visualize the concept of transforming our data in a stream
find . -type f -print0 |
xargs -0 -I{} stat -c '%s %n' {} |
sort -n |
tail -n 1 |
awk '{print }'
相同的模式,但是现在选择最新的文件而不是最大的文件。
# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} |
sort -n | tail -n 1 | awk '{print }'
说明:
查找:以递归方式从当前目录中查找所有文件,并使用空字符将其打印出
xargs:utility to使用标准输入提供的参数执行命令。对于输出的每一行,我们都希望在该文件上运行stat实用程序
stat:Stat是一个非常出色的命令,它包含许多用例。我要打印两列,第一列是块大小(%s),第二列是文件名(%n)
sort:使用数字开关对结果进行排序。由于第一个参数是整数,因此我们的结果将正确排序
tail:仅选择输出的最后一行(由于列表已排序,这是最大的文件!)
awk:选择第二个列,其中包含文件名,并且是递归目录中最大的文件。
Python解决方案
#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
for filename in filenames:
realpath = os.path.join(dirpath, filename)
files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)
该脚本需要花费更长的时间来解释,但是基本上,如果将其另存为脚本,它将搜索命令行上提供的第一个参数,并返回该目录中最大的文件。该脚本不进行错误检查,但应该使您了解如何在Python中进行处理,这为您提供了一种很好的平台无关的解决此问题的方法。
#10 楼
这个答案来自类似的问题find . -type f -exec du -ah {} + | sort -rh | more
#11 楼
在AIX和HP-UX以外的任何平台上都可以使用的东西是:find . -ls | sort +6 | tail
评论
是否要分别列出每个子目录中的文件,还是要查找所有子目录中的所有文件并按大小列出它们,而不管它们位于哪个子目录中?另外,“目录”和“文件夹”是什么意思?您似乎正在使用它们来描述不同的事物。您是在说只想列出给定目录中的文件及其子目录中的文件,而不只是显示子目录吗?请尝试清理您的问题,这不是很清楚。
相关的unix.stackexchange.com/questions/158289/…