在Mac OS 10.6上获得排序的,人类可读的du输出的最有效方法是什么?

时间:2010-08-23 09:52:36

标签: sorting command-line osx-snow-leopard bash gnu-coreutils

我曾经有过这个甜蜜的别名,我称之为dusort,它会打印出一个人类可读的顶级子目录大小列表+按大小排序的文件。它就像是在终端中运行的mac迷你文件灯。

但是现在我的别名在我将其复制到运行Mac OS 10.6的新Mac后被破坏了。显然我使用的那种来自fink(我试图避免在我的新Mac上重新安装)或者10.6的运输功能比10.4运输的功能少(远不太可能。)

这是旧的别名,有点kludgy因为它必须运行du两次以获得机器可读和人类可读的文件大小(我实际上已将其保存为带有#!/的〜/ bin中的脚本bin / bash但这应该不重要): sort -n +1<(paste<(du -hd1 | cut -f1)<(du -d1))| cut -f1,3

任何想法: A.让它再次运作? B.使用bash魔法使这个命令更优雅?

我知道我可以通过将du输出复制到临时文件或者fifo或者一些这样的废话来解决这个问题,但这太荒谬了。我决定来这里寻求帮助,以克服我的kashdgy bash习惯。请指教。 :)

编辑:

现在我考虑一下,这有效:

sort <(paste <(du -d1|cut -f1) <(du -hd1))|cut -f2,3

尽管如此,看起来像是一个巨大的kludge,特别是两次调用du,这可能会在一个大文件树上产生5分钟到10分钟之间的差异......有任何关于清理它的建议吗?

2 个答案:

答案 0 :(得分:1)

我在red hat linux上使用它,也许它也适用于BSD?:

du -sk * | sort -n | awk '
{ if ($1 < 1024) { output("K", 1) }
  else if ($1 < 1048576) { output("M", 1024) }
  else { output("G", 1048576) }
}

function output(size, div)
{
  printf "%d%s\t%s\n", ($1/div), size, $2
}
'

或者要设置为别名,需要引用一些内容:

alias dusort='du -sk * | sort -n | awk '\''
{ if ($1 < 1024) { output("K", 1) }
  else if ($1 < 1048576) { output("M", 1024) }
  else { output("G", 1048576) }
}
function output(size, div)
{
  printf "%d%s\t%s\n", ($1/div), size, $2
}
'\'''

如果你有任何太字节文件,你需要扩展它......

答案 1 :(得分:-1)

alias dsize='for dir in *; do du -skh $dir; done | sort -n'

给出这样的输出(其中数据 img util 是目录):

$ dsize
1.9G     data
4.0K     getLinkMentionCounts.bash
4.0K     img
28K      util