поєднуйте найкраще з 'du' та 'tree'


21

Мені цікаво, чи можемо ми поєднати чесність 'du' з відступним форматуванням 'tree'. Якщо я хочу перелічити розміри каталогів:

du -hx -d2

... відображає два рівні глибоко, і всі підсумки розмірів є чесними, але відступів підкаталів немає. З іншої сторони:

tree --du -shaC -L 2

... відступи та кольори красиво, проте повідомлені розміри - брехня. Для отримання реальних розмірів необхідно:

tree --du -shaC

... що означає, що справжні розміри ви отримуєте лише в тому випадку, якщо ви дозволяєте "дереву" показати вам всю структуру каталогів. Я хотів би мати можливість завжди мати правильні підсумки розмірів незалежно від того, скільки рівнів підкаталів я бажаю відображати. Я часто роблю це:

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, з відображенням на карті.

fsv - 3D візуалізація.

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


1
Дякую, Девіде, нарешті обійшов їх. Я вибрав ncdu.
Рей Ендрюс

@David, звідки береться Tdu?
shirish

@shirish Зверніться до мого джерела, зазначеного вище
David Potočnik

11

Вам не потрібно чіплятися за кольоровим кодом, -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", що є розміром записи для самого dir, але не розміром всього вмісту.
Рей Ендрюс

... повинен був сказати "4096" для кожного каталогу в поточному каталозі ... але ви не отримаєте розміри dir, включаючи файли.
Рей Ендрюс

Ви лише згадали -L, що це проблема, і зовсім не згадали -d. Тепер, коли я більш уважно придивляюся до повідомлених цифр, а tree --duтакож tree --du -dрозмірів звітів, які жодним чином не нагадують ті, про які повідомляється du.
cas

Слід зазначити, що нічого менше 100% дисплея не дасть вам правильних розмірів. Ви можете обмежити через '-d' або '-L 2' або що-небудь ще - це не відображається, не враховується в розмірі.
Рей Ендрюс

tree --duяк видається , не дають правильні розміри для каталогів в будь-якому випадку, з або без -dабо -L. Я поняття не маю, які цифри повинні бути, але вони не пов'язані з тим, які duзвіти.
cas

3

Можна використовувати дутре

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

  • кольоровий вихід відповідно до змінної середовища LS_COLORS.
  • відобразити дерево файлової системи
  • можливість агрегації невеликих файлів
  • можливість виключення файлів або каталогів
  • вміння порівнювати різні каталоги
  • швидкий, написаний в іржі

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є те, що параметри можуть відображатися в будь-якому порядку в командному рядку. Первісна версія mytreeфункції, яку я написав, використовувала "$ 1" так само, як і ваша, тому аргумент глибини повинен був бути першим аргументом, і він не був необов'язковим. Я вирішив, що недостатньо добре, тому використовував bash-вбудований getoptsдля обробки -Lваріант. Це дозволило -L nз'явитись у будь-якому місці командного рядка. Це також дозволило бути абсолютно необов’язковим.
cas

Ще один спосіб дивитися на це - це getoptsдозволяє писати сценарії, які приймають реальні параметри та аргументи (а не просто аргументи у твердо кодованих позиціях, як $ 1 $ 2 $ 3 тощо), як і більшість інших програм у вашій системі. І якщо ви використовуєте getoptпрограму (зауважте, що без s) із util-linuxпакету, ви можете використовувати як короткі однолітерні параметри (наприклад -l), так і довгі варіанти (як --long), як і програми GNU.
cas

Ах ... це повертається до мене зараз. Так, я фактично користувався цим колись. Потрібно ще раз поглянути на це. Спасибі.
Рей Ендрюс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.