объединить лучшее из 'du' и 'tree'

21

Мне интересно, можем ли мы объединить честность 'du' с отступом форматирования 'tree'. Если я хочу список размеров каталогов:

du -hx -d2

... отображает два уровня глубины, и все сводки размеров являются честными, но здесь нет отступов подкаталогов. С другой стороны:

tree --du -shaC -L 2

... отступы и цвета красиво, однако сообщенные размеры являются ложью. Чтобы получить реальные размеры, необходимо:

tree --du -shaC

... что означает, что вы получите истинные размеры, только если вы позволите 'tree' показать вам всю структуру каталогов. Я хотел бы иметь возможность всегда иметь правильные итоговые размеры независимо от того, сколько уровней я хочу отображать. Я часто делаю это:

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

... который удаляет все, кроме каталогов, и красиво делает отступы ... но нет простого способа ограничить отображение только определенным количеством уровней (без подведения итогов). Есть ли способ? Возможно, я пропустил правильные переключатели ...

Рэй Эндрюс
источник

Ответы:

8

Также проверьте ncdu : http://dev.yorhel.nl/ncdu

На его странице также перечислены другие «похожие проекты»:

gt5 - очень похоже на ncdu, но другой подход.

tdu - Еще одна небольшая утилита визуализации использования дисков на основе ncurses.

TreeSize - GTK, использующий древовидную структуру.

Баобаб - GTK, использующий круговые диаграммы, древовидную структуру и древовидную карту. Поставляется с GNOME.

GdMap - GTK, с отображением древовидной карты.

Filelight - KDE, используя круговые диаграммы.

KDirStat - KDE, с отображением древовидной карты.

QDiskUsage - Qt, используя круговые диаграммы.

xdiskusage - FLTK, с отображением древовидной карты.

фсв - 3D визуализация.

Philesight - веб-клон Filelight.

Давид Поточник
источник
1
Спасибо, Дэвид, наконец-то нашел время посмотреть на них. Я выбрал ncdu.
Рэй Эндрюс
@ Дэвид, откуда берется тду?
Шириш
@shirish Обратитесь к моему источнику, указанному выше
Дэвид Поточник
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}.

Вы можете превратить это в функцию оболочки, вот так:

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 --duни tree --du -dразмеры отчетов , которые каким - либо образом напоминают, сообщаемых du.
Cas
Суть в том, что что-либо менее 100% дисплея не даст вам правильных размеров. Вы можете ограничить с помощью '-d' или '-L 2' или чего-либо еще - если это не показано, это не учитывается в размере.
Рэй Эндрюс
tree --duпохоже, не дает правильных размеров для каталогов, с или без -dили -L. Я понятия не имею, какими должны быть цифры, но они не связаны с какими duотчетами.
Cas
3

Вы можете использовать Dutree

введите описание изображения здесь

  • цветной вывод в соответствии с переменной окружения LS_COLORS.
  • отобразить дерево файловой системы
  • способность собирать небольшие файлы
  • возможность исключать файлы или каталоги
  • умение сравнивать разные каталоги
  • быстро, написано в Rust
nachoparker
источник
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
Как только у нас все получится, я собираюсь спросить вас об этом: пожалуйста, уточните. Конечно, насчет $ @, но пока я использую его только в текущем каталоге, так что пока не заметил. Все эти вещи "getopts" являются новыми для меня, я хотел бы знать, что вы там думаете.
Рэй Эндрюс
Одним из преимуществ использования getoptsявляется то, что параметры могут появляться в любом порядке в командной строке. Первоначальная версия mytreeфункции, которую я написал, использовала «$ 1» так же, как и ваша, поэтому аргумент глубины должен был быть первым аргументом, и он не был обязательным. Я решил, что это не достаточно хорошо, поэтому использовал встроенную в bash getoptsдля обработки -Lопцию. Это позволило -L nопции появляться в любом месте командной строки. Это также позволило ему быть полностью необязательным.
Cas
Другой способ взглянуть на это заключается в том, что getoptsвы можете писать сценарии, которые принимают реальные параметры и аргументы (а не просто аргументы в жестко запрограммированных позициях, таких как $ 1 $ 2 $ 3 и т. д.), как и большинство других программ в вашей системе. И если вы используете getoptпрограмму (обратите внимание, что без s) из util-linuxпакета, вы можете использовать как короткие однобуквенные параметры (например -l), так и длинные (например --long), как программы GNU.
Cas
Ах ... теперь это возвращается ко мне. Да, я действительно использовал это однажды. Надо еще раз взглянуть на это. Спасибо.
Рэй Эндрюс