结合“ du”和“ tree”的精华


21

我想知道我们是否可以将“ du”的诚实性与“ tree”的缩进格式结合起来。如果我要列出目录大小:

du -hx -d2

...显示了两个级别的深度,所有大小的摘要都是真实的,但是没有子目录的缩进。另一方面:

tree --du -shaC -L 2

...压痕和着色很好,但是报告的尺寸是一个谎言。要获得实际尺寸,必须:

tree --du -shaC

...这就是说,如果您让“树”向您展示整个目录结构,则只有真正的大小。无论我要实际显示多少个子目录级别,我都希望能够始终具有正确的大小摘要。我经常这样做:

tree -du -shaC | grep "\[01;34m"

...会修剪除目录之外的所有内容,并使其缩进... ...但是没有简单的方法将显示限制为给定的数字级别(不包含摘要)。有办法吗?也许我错过了正确的开关...

Answers:


8

还要结帐ncduhttp : //dev.yorhel.nl/ncdu

它的页面还列出了其他“类似项目”:

gt5-非常类似于ncdu,但是方法不同。

tdu-另一个基于ncurses的小型磁盘使用情况可视化实用程序。

TreeSize-GTK,使用树视图。

猴面包树-GTK,使用饼图,树视图和树图。GNOME附带。

GdMap-GTK,带有树状图显示。

Filelight-KDE,使用饼图。

KDirStat-KDE,带有树状图显示。

QDiskUsage-Qt,使用饼图。

xdiskusage-FLTK,带有树状图显示。

fsv-3D可视化。

Philesight-Filelight的基于Web的克隆。


1
谢谢戴维,终于终于可以看看这些了。我选了ncdu。
雷·安德鲁斯

@David tdu来自哪里?
shirish

@shirish请参阅上面提到的我的消息来源
DavidPotočnik17年

11

您不需要grep输入颜色代码,-d选项为list directories only

这似乎可以满足您的要求:

$ tree --du -d -shaC | grep -Ev '(  *[^ ]* ){2}\['
.
├── [  18]  dir1
├── [  30]  dir2
├── [ 205]  junk
│   ├── [  18]  dir1
│   ├── [  30]  dir2
│   └── [  76]  dir3
├── [ 119]  merge
└── [  20]  stuff

 4.4K used in 10 directories

grep命令将两次删除所有行(一个或多个空格,后跟一个非空格,后跟一个空格),然后删除一个[

如果您希望深度为1,请将{}花括号内的装订数更改为{1}而不是{2}。如果希望深度为3,则将其更改为{3}

您可以将其转换为shell函数,如下所示:

mytreedu() {
  local depth=''

  while getopts "L:" opt ; do
      case "$opt" in
          L) depth="$OPTARG" ;;
      esac
  done

  shift "$((OPTIND-1))"

  if [ -z "$depth" ] ; then
      tree --du -d -shaC "$@"
  else   
      local PATTERN='(  *[^ ]* ){'"$depth"'}\['
      tree --du -d -shaC "$@" | grep -Ev "$PATTERN"
  fi
}

这用于从命令行getopts“窃取”任何-L选项及其参数tree(如果有)。如果-L n命令行上没有选项,则也可以。

所有其他选项和参数均传递给tree命令。

local PATTERN=...条线不是必须的。我只是这样做,以确保它只适合一行,而不会在此处自动换行U&L。正则表达式可以并且可能应该直接tree | grep ...在线。

像这样运行它:

mytreedu 

要么

mytreedu -L 2 /path/to/dir/

1
我喜欢代码,但请重复一遍,您不能使用'-d',因为如果这样做,则大小汇总不正确,或者至少它们在此处。该大小将始终报告为“ 4096”,这是目录本身的条目大小,而不是其所有内容的大小。
雷·安德鲁斯

...应该为当前目录下的每个目录说'4096'...但是您没有得到包含文件的目录的大小。
雷·安德鲁斯

您只是提到-L是一个问题,根本没有提及-d。现在,我将更加仔细地查看报告的数字,无论tree --dutree --du -d报告大小,还是与报道的数字都不相似du
cas 2015年

要点是,任何小于100%的显示都不会为您提供正确的尺寸。您可以通过'-d'或'-L 2'或其他任何方式进行限制-它没有显示,也不在大小中。
雷·安德鲁斯

tree --du似乎并没有无论如何都要给出正确的尺寸目录,有或无-d-L。我不知道这些数字应该是多少,但是它们与什么du报告无关。
cas 2015年

3

您可以使用dutree

在此处输入图片说明

  • 根据LS_COLORS环境变量进行彩色输出。
  • 显示文件系统树
  • 汇总小文件的能力
  • 排除文件或目录的能力
  • 比较不同目录的能力
  • 快速,用Rust编写

1

没有完美的命令工具可以执行此操作,但是我发现了两种简单的方法。

  • 显示文件夹和文件的大小,但不显示为树形模式。

    du -ah --max-depth=1 /var/log

  • 以树模式显示,但仅文件大小,文件夹以计数为单位

    tree -ah /var/log -L 1


0

受cas启发,我现在正在这样做:

treee ()
{
    integer levels=$(( ($1 + 1) * 4 ))
    tree --du -shaC | grep "\[01;34m" | grep -Ev "^[^\[]{$levels}\[*"
    du -sh .
}

如果您要丢弃所有getopts内容,则至少应在"$@"紧随其后-shaC。否则,该函数将进行硬编码,仅适用于当前目录。
cas 2015年

一旦事情解决了,我将向您询问:请详细说明。当然,关于“ $ @”,但是到目前为止,我只在当前目录中使用过它,所以还没有注意到。所有这些“ getopts”东西对我来说都是新的,我想知道你在想什么。
雷·安德鲁斯

使用的好处之一getopts是选项可以在命令行中以任何顺序出现。mytree我编写的函数的初始版本就像您使用的那样使用“ $ 1”,因此depth参数必须是第一个参数,并且不是可选的。我认为这还不够好,所以使用bash-builtin getopts处理该-L选项。这允许该-L n选项出现在命令行的任何位置。它还允许它是完全可选的。
cas 2015年

另一种看待它的方式是,getopts允许您编写带有实际选项和参数的脚本(而不是仅将args置于诸如$ 1 $ 2 $ 3等硬编码位置),就像系统上的大多数其他程序一样。而且,如果您使用getopt程序包中的程序(请注意,其中没有s),则util-linux可以像GNU程序-l一样使用短单字母选项(例如)和长选项(例如--long)。
cas 2015年

啊...现在又回到了我。是的,我实际上曾经使用过一次。必须再看一遍。谢谢。
雷·安德鲁斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.