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命令的限制(显然, xargspipe道正在将结果拆分成更多的行,打破了我的命令的逻辑)。 因此, 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。