Bash:如何列出每个文件和目录的大小(recursion)并按大小sorting?
我发现在Bash中不容易获得目录的大小?
我想当我键入ls -<some options>
,
它可以同时列出所有目录文件大小和文件大小的总和,并按大小顺序sorting。
那可能吗?
只需导航到目录并运行以下命令:
du -a --max-depth=1 | sort -n
或者为人们可读的大小添加-h,-r首先打印更大的目录/文件。
du -a -h --max-depth=1 | sort -hr
du -s * | sort -n
(这不会显示隐藏的(.dotfiles)文件)
使用du -sm
的Mb单位等我总是使用
du -smc * | sort -n
因为总线( -c
)将在底部出现明显的原因:)
PS:
- 请参阅处理点文件的注释
- 我经常使用例如'du -smc / home / / | sort -n | tail'来感受大位在哪里
命令
du -h --max-depth=0 * | sort -hr
产量
3,5M asdf.6000.gz 3,4M asdf.4000.gz 3,2M asdf.2000.gz 2,5M xyz.PT.gz 136K xyz.6000.gz 116K xyz.6000p.gz 88K test.4000.gz 76K test.4000p.gz 44K test.2000.gz 8,0K desc.common.tcl 8,0K wer.2000p.gz 8,0K wer.2000.gz 4,0K ttree.3
说明
-
du
显示“磁盘使用情况” -
h
是“人类可读的”(无论是在sorting还是在杜) -
max-depth=0
表示du
不会显示子文件夹的大小(如果要显示每个子文件夹,子文件夹,…文件夹中的每个文件的所有大小,请将其删除) -
r
是“反向”(最大的文件第一)
显然, --max-depth
选项不在Mac命令的Mac OS X版本中。 您可以使用以下代替。
du -h -d 1 | sort -n
ls -S
按大小sorting。 然后,为了显示大小, ls -lS
给出一个很长的( -l
),按大小( -S
)显示。 我通常也会加上-h
,让事情更容易阅读,所以, ls -lhS
。
简单而快速:
find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n
*需要GNU并行 。
我想我可能已经想出了你想要做的事情。 这将给出所有文件和所有目录的sorting列表,按目录中的文件大小和内容大小sorting。
(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
[增强版]
这将比下面的初始版本更快更精确,并将输出当前目录的所有文件大小的总和:
echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
文件上的stat -c %s
命令将以字节为单位返回其大小。 这里的tr
命令用于克服xargs
命令的限制(显然, xargs
pipe道正在将结果拆分成更多的行,打破了我的命令的逻辑)。 因此, tr
正在考虑使用+
(加号)replace换行符。 sed
有唯一的目标是从结果string中删除最后的+
符号,以避免最后的bc
(基本计算器)命令的抱怨,像往常一样,math。
性能:我testing了几个目录和超过150.000个文件顶部(我的fedora 15盒的当前文件数),我相信这是一个惊人的结果:
# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc 12671767700 real 2m19.164s user 0m2.039s sys 0m14.850s
为了防止与du -sb /
命令进行比较,它将以字节( -b
选项)输出估计的磁盘使用情况
# du -sb / 12684646920 /
由于我期待它比我的命令计算有点大,因为du
实用程序返回每个文件的分配空间而不是实际消耗的空间。
[初始版本]
如果您需要知道文件夹的确切总和大小,则不能使用du
命令,因为(根据手册页引用) du
估计文件空间的使用情况。 因此,它会导致你一个错误的结果,一个近似(也许接近总和的大小,但最有可能比你正在寻找的实际大小更大)。
我想可能有不同的方法来回答你的问题,但这是我的:
ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc
它find所有的文件。 目录(改变你喜欢的任何目录),也包括隐藏文件,并且(使用xargs
)在一行中输出它们的名字,然后使用ls -l
产生一个详细列表。 这个(有时)巨大的输出是通过pipe道切割命令,只有第五个字段( -f5
),这是文件大小以字节为单位,再次对xargs
进行pipe道输出,再次产生由空白分隔的一行大小。 现在发生一个sed魔术,用加号( +
)来代替每个空格,最后bc
(基本计算器)会计算math。
它可能需要额外的调整,你可能有ls
命令抱怨参数列表太长。
另一个简单的方法
$ for entry in $(ls); do du -s "$entry"; done | sort -n
结果会看起来像
2900 tmp 6781 boot 8428 bin 24932 lib64 34436 sbin 90084 var 106676 etc 125216 lib 3313136 usr 4828700 opt
将“du -s”改为“du -sh”会显示出人们可读的大小,但是我们不能用这种方法来sorting。
您可以使用下面的按大小du -h |列出文件 sort -hr | more或du -h –max-depth = 0 * | sort -hr | 更多
我倾向于用简单的方式来使用du。
du -sh */ | sort -n
这给了我一个什么目录消耗最多空间的想法。 之后我可以运行更精确的search。