DU: mostra apenas pastas em profundidade

11

Estou recebendo resultados du -hcomo os seguintes:

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

Eu gostaria de mostrar apenas a pasta mais acionável, que é a pasta ./.wine/drive_c/windows/mono/mono-2.0/lib/mono

Existe alguma maneira de remover a pasta pai se uma pasta filha for responsável pela maior parte do uso do espaço em disco?

Uma configuração para mostrar apenas pastas folhadas pode funcionar, ou uma configuração para subtrair o tamanho de todas as subpastas de uma pasta pai ao calcular o tamanho da pasta pai.

EoghanM
fonte
Isso geralmente é mais fácil de rastrear visualmente; consulte Como entender o que está ocupando espaço?
Gilles 'SO- stop be evil'

Respostas:

11

Se você estiver usando o GNU du, poderá usar a opção -Sou --separate-dirspara não incluir o tamanho dos subdiretórios ao calcular o uso do pai.

Seu ducomando pode não suportar esta opção.

Você pode usar esse par com classificação para obter os maiores diretórios individuais (assumindo as ferramentas GNU):

du --separate-dirs -h . |sort -h
Craig
fonte
Isso parece satisfazer a parte 'subtrair o tamanho de todas as subpastas de uma pasta pai ao calcular o tamanho da pasta pai' da minha consulta, então provavelmente aceitará! Eu não tenho certeza que é exatamente satisfazer as minhas necessidades embora (tentando encontrar o maior número de pastas acionáveis para eliminar a fim de recuperar espaço)
EoghanM
9

Pessoalmente, eu apenas o combino com o poder do tipo GNU:

du -ch | sort -h

Isso fará com que os tamanhos sejam classificados em um formato legível por humanos. Por exemplo:

$ 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

De man sort:

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

Ele ainda mostra aqueles com os quais você não se importa, mas agora é muito fácil encontrar os que você faz.

terdon
fonte
Não, isso na verdade piora, como agora aparece 545M ./.wine/drive_cno topo da lista, mesmo que contenha apenas pastas e nenhum arquivo, e torna mais difícil ver como o espaço é distribuído entre as subpastas (recursivas) de drive_c porque elas não aparece consecutivamente na lista.
EoghanM
6

Se você está apenas procurando uma visão claramente organizada, recomendo o dureppacote.

Exemplo de saída:

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/

Use o -tdparâmetro para especificar a profundidade máxima e o -hsparâmetro para especificar um tamanho mínimo para uma pasta aparecer nos resultados.

Martin von Wittich
fonte
2

Não tenho certeza se é isso que você deseja, mas você pode remover os diretórios pai usando os GNU find's -execdir:

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

A -execdiropção é semelhante a, -execmas executa o comando que você fornece no subdiretório onde findencontrou um arquivo.

Joseph R.
fonte
hmmm, isso não parece funcionar como você descreve. Ainda estou recebendo muitos diretórios pai na saída.
EoghanM
2

Se você estiver usando duuma profundidade fixa, por exemplo du -m -d 2 ., poderá mascarar linhas que não atinjam sua profundidade máxima da seguinte forma:

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

Nesse caso, eu queria uma profundidade de 2 diretórios, então só mantive os resultados com 3 campos, conforme definido com a awkpalavra - chave, NFdepois de especificar "/"como meu separador de campos no início.

isosceleswheel
fonte
0

Ambos funcionam para mim:

 du -h | perl -ne '$n=()=$_=~m#/#g;  print unless $n > 2'
 du -h | perl -ne 'print unless ($n=()=$_=~m#/#g) > 2 '
huw
fonte
Um pequeno comentário, para que os números correspondam, a correspondência deve estar em um contexto de lista e é por isso que precisamos ().
Huw
du -h Perl -ne 'print a menos que (() = $ _ = ~ m # / # g)> 2'
huw