DU: показывать только папки на глубине


11

Я получаю вывод, du -hкак в следующем:

103M    ./.wine/drive_c/windows/mono/mono-2.0/lib/mono
103M    ./.wine/drive_c/windows/mono/mono-2.0/lib
129M    ./.wine/drive_c/windows/mono/mono-2.0
129M    ./.wine/drive_c/windows/mono
362M    ./.wine/drive_c/windows
545M    ./.wine/drive_c

Я хотел бы показать только самую активную папку, которая является папкой ./.wine/drive_c/windows/mono/mono-2.0/lib/mono

Есть ли способ удалить родительскую папку, если дочерняя папка отвечает за большую часть использования дискового пространства?

Параметр, позволяющий показывать только конечные папки, может помочь, или параметр, позволяющий вычитать размер всех подпапок из родительской папки при расчете размера родительской папки.


Ответы:


11

Если вы используете GNU du, вы можете использовать опцию -Sили, --separate-dirsчтобы не включать размер подкаталогов при расчете использования для родителя.

Ваша duкоманда может не поддерживать эту опцию.

Вы можете использовать эту пару с сортировкой, чтобы получить самые большие отдельные каталоги (с учетом инструментов GNU):

du --separate-dirs -h . |sort -h

Кажется, это удовлетворяет части моего запроса «вычесть размер всех подпапок из родительской папки при расчете размера родительской папки», поэтому, скорее всего, приму! Я не уверен, что это точно удовлетворяет мои потребности (пытаясь найти наиболее действенные папки для удаления, чтобы
освободить

9

Лично я просто комбинирую это с мощью сортировки GNU:

du -ch | sort -h

Это приведет к сортировке размеров в удобочитаемом формате. Например:

$ du -h /usr/ | head -20 | sort -h
8.0K    /usr/src/linux-headers-3.2.0-3-common/include/misc
12K /usr/src/linux-headers-3.2.0-3-common/include/drm/i2c
12K /usr/src/linux-headers-3.2.0-3-common/include/net/netfilter/ipv4
16K /usr/src/linux-headers-3.2.0-3-common/include/net/netfilter/ipv6
20K /usr/src/linux-headers-3.2.0-3-common/include/net/phonet
28K /usr/src/linux-headers-3.2.0-3-common/include/acpi/platform
52K /usr/src/linux-headers-3.2.0-3-common/include/net/netns
60K /usr/lib32/libv4l
76K /usr/src/linux-headers-3.2.0-3-common/include/net/caif
96K /usr/src/linux-headers-3.2.0-3-common/include/scsi/fc
108K    /usr/src/linux-headers-3.2.0-3-common/include/net/bluetooth
112K    /usr/src/linux-headers-3.2.0-3-common/include/drm/ttm
148K    /usr/src/linux-headers-3.2.0-3-common/include/net/netfilter
264K    /usr/src/linux-headers-3.2.0-3-common/include/rdma
284K    /usr/src/linux-headers-3.2.0-3-common/include/acpi
596K    /usr/src/linux-headers-3.2.0-3-common/include/drm
608K    /usr/src/linux-headers-3.2.0-3-common/include/scsi
668K    /usr/games
6.3M    /usr/lib32/gconv
8.9M    /usr/lib32

От man sort:

   -h, --human-numeric-sort
          compare human readable numbers (e.g., 2K 1G)

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


Нет, это на самом деле делает его еще хуже, как теперь показано 545M ./.wine/drive_cв верхней части списка, хотя в нем содержатся только папки и нет файлов, и становится сложнее увидеть, как распределяется пространство между (рекурсивными) подпапками диска drive_c, поскольку они не не появляются последовательно в списке.
EoghanM

6

Если вы просто ищете четко организованный вид, я рекомендую durepпакет.

Пример вывода:

root@dogmeat:~# durep -td 4 -hs 50M /usr/
[ /usr     4.8G (0 files, 9 dirs) ]
   1.9G [###########                   ]  38.57% lib/
     463.6M [#######                       ]  24.46% x86_64-linux-gnu/
         102.3M [######                        ]  22.07% wine/
     276.2M [####                          ]  14.57% i386-linux-gnu/
          96.1M [##########                    ]  34.80% wine/
     222.4M [###                           ]  11.73% libreoffice/
         189.3M [#########################     ]  85.12% program/
     122.6M [#                             ]   6.47% chromium-browser/
          87.6M [#####################         ]  71.46% chromium-browser
      79.5M [#                             ]   4.19% virtualbox/
      79.4M [#                             ]   4.19% jvm/
          73.4M [###########################   ]  92.52% java-7-openjdk-amd64/
              73.4M [############################# ]  99.99% jre/
      75.7M [#                             ]   3.99% python2.7/
          58.4M [#######################       ]  77.21% dist-packages/
      58.9M [                              ]   3.11% firefox/
      52.2M [                              ]   2.75% libwireshark.so.2.0.2
   1.4G [########                      ]  29.56% src/
   1.2G [#######                       ]  26.03% share/
     211.6M [####                          ]  16.54% fonts/
         199.3M [############################  ]  94.18% truetype/
              84.2M [############                  ]  42.23% horai-umefont/
     174.6M [####                          ]  13.64% icons/
          91.5M [###############               ]  52.39% gnome/
              66.4M [#####################         ]  72.60% icon-theme.cache
      77.5M [#                             ]   6.05% gimp/
          77.5M [##############################] 100.00% 2.0/
              66.2M [#########################     ]  85.43% help/
      74.4M [#                             ]   5.82% virtualbox/
          56.9M [######################        ]  76.42% VBoxGuestAdditions.iso
      62.9M [#                             ]   4.91% doc/
 240.1M [#                             ]   4.89% bin/

Используйте -tdпараметр, чтобы указать максимальную глубину, и -hsпараметр, чтобы указать минимальный размер папки, отображаемой в результатах.


2

Не совсем уверен , если это то , что вы хотите, но вы можете лишить родительские каталоги с помощью GNU find«s -execdir:

find . -type d -execdir du -ch "{}" \;

Параметр -execdirаналогичен, -execно выполняет команду, указанную в подкаталоге, в котором findбыл найден файл.


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

2

Если вы используете duфиксированную глубину, например du -m -d 2 ., вы можете просто замаскировать линии, которые не достигают вашей максимальной глубины, вот так:

du -m -d 2 . | sort -k1n | awk -F"/" 'NF==3'

В этом случае я хотел, чтобы глубина составляла 2 каталога, поэтому я сохранял результаты только с 3 полями, как определено с awkключевым словом, NFпосле того, "/"как в начале был указан мой разделитель полей.


0

Они оба работают для меня:

 du -h | perl -ne '$n=()=$_=~m#/#g;  print unless $n > 2'
 du -h | perl -ne 'print unless ($n=()=$_=~m#/#g) > 2 '

Небольшой комментарий, чтобы сопоставить числа, совпадение должно быть в контексте списка, поэтому нам нужно ().
августа

ду-х | perl -ne 'print, если (() = $ _ = ~ m # / # g)> 2'
huw
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.