Como listar o tamanho de cada arquivo e diretório e classificar por tamanho decrescente no Bash?

108

Descobri que não é fácil conseguir o tamanho de um diretório no Bash?

Eu quero que, quando eu digitar ls -<some options>, ele possa listar toda a soma do tamanho do arquivo do diretório recursivamente e arquivos ao mesmo tempo e classificar por ordem de tamanho.

Isso é possível?

Kit Ho
fonte
2
O que exatamente você quer dizer com "tamanho" de um diretório? O número de arquivos sob ele (recursivamente ou não)? A soma dos tamanhos dos arquivos abaixo dele (recursivamente ou não)? O tamanho do disco do próprio diretório? (Um diretório é implementado como um arquivo especial contendo nomes de arquivos e outras informações.)
Keith Thompson,
deve ser A soma dos tamanhos dos arquivos sob ele recursivamente
Kit Ho
1
@Kit: Então dué a resposta.
Keith Thompson,
O ducomando @KeithThompson @KitHo estima o uso do espaço no arquivo, portanto, você não pode usá-lo se quiser obter o tamanho exato.
ztank1013
@ ztank1013: Dependendo do que você entende por "o tamanho exato", du(pelo menos a versão GNU coreutils) provavelmente tem uma opção para fornecer as informações.
Keith Thompson

Respostas:

218

Basta navegar até o diretório e executar o seguinte comando:

du -a --max-depth=1 | sort -n

OU adicione -h para tamanhos legíveis por humanos e -r para imprimir diretórios / arquivos maiores primeiro.

du -a -h --max-depth=1 | sort -hr
Desenvolvedor
fonte
23
du -hrequer sort -htambém, para garantir que, digamos 981Mtipos antes 1.3G; com sort -napenas os números seriam levados em consideração e eles estariam ao contrário.
Smylers de
Isso não lista o tamanho dos arquivos individuais dentro do diretório atual, apenas o tamanho de seus subdiretórios e o tamanho total do diretório atual. Como você incluiria arquivos individuais na saída também (para responder à pergunta do OP)?
Erik Trautman
@ErikTrautman para listar os arquivos que você também precisa adicionar -ae usar em --allvez de --max-depth=1assimdu -a -h --all | sort -h
Franco
Impressionante! Eu tenho feito algo mais lameroso há alguns anos. :)
Colby Blair
6
sort -hsó funciona na versão GNU / Linux, sem sorte com BSD / OS X.
djule5
20

Aparentemente, a --max-depthopção não está na versão do Mac OS X do ducomando. Você pode usar o seguinte.

du -h -d 1 | sort -n

cevaris
fonte
Aparentemente, mas não surpreendentemente.
Josh Habdas
20
du -s -- * | sort -n

(isso não mostrará arquivos ocultos (.dotfiles))

Use du -smpara unidades Mb etc. Eu sempre uso

du -smc -- * | sort -n

porque a linha total ( -c) terminará na parte inferior por razões óbvias :)

PS:

  • Veja os comentários para lidar com arquivos de ponto
  • Eu freqüentemente uso, por exemplo, 'du -smc / home / / | sort -n | tail 'para ter uma ideia de onde exatamente os pedaços grandes estão colocados
ver
fonte
5
du --max-depth=1|sort -nou find . -mindepth 1 -maxdepth 1|xargs du -s|sort -npara incluir dotfiles também.
Arnaud Le Blanc de
@arnoud: Eu também uso isso, mas não me pareceu o acréscimo correto para esta pergunta (/ resposta) :)
ver
@ arnaud576875 find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -nse alguns dos caminhos encontrados puderem conter espaços.
Lri,
1
Esta é uma ótima variante para obter uma visão humana legível do maior:sudo du -smch * | sort -h | tail
marsbard
16

Comando

du -h --max-depth=0 * | sort -hr

Resultado

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

Explicação

  • du exibe "uso de disco"
  • h é para "legível por humanos" (ambos, in sort e in du)
  • max-depth=0significa duque não mostrará os tamanhos das subpastas (remova isso se quiser mostrar todos os tamanhos de cada arquivo em cada sub-, subsub-, ..., pasta)
  • r é para "reverso" (o maior arquivo primeiro)

ncdu

Quando cheguei a esta pergunta, queria limpar meu sistema de arquivos. A ferramenta de linha de comando ncdué muito mais adequada para essa tarefa.

Instalação no Ubuntu:

$ sudo apt-get install ncdu

Uso:

Basta digitar ncdu [path]na linha de comando. Após alguns segundos para analisar o caminho, você verá algo assim:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

Exclua o elemento atualmente destacado com d, saia com CTRL+c

Martin Thoma
fonte
Você também pode escrever du -hs * | sort -hr. -s (resumir) é o mesmo que --max-depth = 0
rasmusx
5

ls -Sclassifica por tamanho. Então, para mostrar o tamanho também, ls -lSfornece uma exibição longa ( -l), classificada por tamanho ( -S). Eu costumo adicionar -htambém, para tornar as coisas mais fáceis de ler, então ls -lhS,.

Thanatos
fonte
1
Ah, desculpe, isso não ficou claro em sua postagem. Você quer du, parece que alguém postou. @sehe: Depende da sua definição de real - mostra a quantidade de espaço que o diretório está usando para se armazenar. (Não é apenas adicionar o tamanho das subentradas.) Não é um número aleatório e nem sempre é 4KiB.
Thanatos,
1

Simples e rápido:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* requer GNU Parallel .

pje
fonte
0

Acho que descobri o que você quer fazer. Isso fornecerá uma lista classificada de todos os arquivos e todos os diretórios, classificados por tamanho de arquivo e tamanho do conteúdo nos diretórios.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
dvorak
fonte
Esqueça, sehe apresentou uma solução muito mais simples. Eu aprendo algo novo todos os dias!
dvorak
Não acho que usar duseja uma opção, vai te dar apenas um resultado aproximado.
ztank1013
0

[versão aprimorada]
Isso será muito mais rápido e preciso do que a versão inicial abaixo e produzirá a soma de todos os tamanhos de arquivo do diretório atual:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

o stat -c %scomando em um arquivo retornará seu tamanho em bytes. O trcomando aqui é usado para superar as xargslimitações do comando (aparentemente o direcionamento para xargsestá dividindo os resultados em mais linhas, quebrando a lógica do meu comando). Portanto, trestá tomando o cuidado de substituir o avanço de linha pelo +sinal (mais). sedtem o único objetivo de remover o último +sinal da string resultante para evitar reclamações do bccomando final (calculadora básica) que, como de costume, faz as contas.

Performances: Eu testei em vários diretórios e mais de ~ 150.000 arquivos no topo (o número atual de arquivos do meu fedora 15) tendo o que eu acredito ser um resultado incrível:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

Apenas no caso de você querer fazer uma comparação com o du -sb /comando, ele irá mostrar uma estimativa de uso do disco em bytes ( -bopção)

# du -sb /
12684646920 /

Como eu esperava, é um pouco maior do que o cálculo do meu comando porque o duutilitário retorna o espaço alocado de cada arquivo e não o espaço real consumido.

[versão inicial]
Você não pode usar o ducomando se precisar saber a soma exata do tamanho da sua pasta porque (conforme citação da página do manual) duestima o uso do espaço no arquivo. Portanto, isso o levará a um resultado errado, uma aproximação (talvez perto do tamanho da soma, mas muito provavelmente maior do que o tamanho real que você está procurando).

Acho que pode haver maneiras diferentes de responder à sua pergunta, mas esta é a minha:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Ele encontra todos os arquivos em. (mude. com o diretório que desejar), também os arquivos ocultos são incluídos e (usando xargs) exibe seus nomes em uma única linha e, em seguida, produz uma lista detalhada usando ls -l. Essa (às vezes) grande saída é direcionada para o comando cut e apenas o quinto campo ( -f5), que é o tamanho do arquivo em bytes, é obtido e novamente direcionado para o xargsqual produz novamente uma única linha de tamanhos separados por espaços em branco. Agora faça uma mágica sed que substitui cada espaço em branco por um +sinal de mais ( ) e, finalmente, bc(calculadora básica) faz as contas.

Pode ser necessário um ajuste adicional e você pode ter o lscomando reclamando sobre a lista de argumentos muito longa.

ztank1013
fonte
se o diretório for muito grande, ele desliga por um longo tempo, tente trabalhar em seu diretório home: p
Kit Ho
@KitHo bem, infelizmente não existe uma maneira fácil e rápida de obter um resultado preciso sem pesquisar cada arquivo e adicionar seu tamanho, portanto, a preguiça de comando depende principalmente de quantos arquivos estão abaixo do diretório pesquisado ... Mas eu acredito que há é margem para melhorias ... bom desafio!
ztank1013
@KitHo ei, dê uma olhada na versão aprimorada em minha resposta ... e me diga, é claro!
ztank1013
0

Outra solução simples.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

o resultado parecerá

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

alterar "du -s" para "du -sh" mostrará o tamanho legível por humanos, mas não poderemos classificar neste método.

Ambal
fonte
0

você pode usar o seguinte para listar arquivos por tamanho du -h | sort -hr | mais ou du -h --max-depth = 0 * | sort -hr | Mais

Ghassan Shawahneh
fonte
0

Eu tendo a usar du de uma maneira simples.

du -sh */ | sort -n

Isso me dá uma ideia de quais diretórios estão consumindo mais espaço. Posso fazer pesquisas mais precisas mais tarde.

Ritmo
fonte
Isso funciona, mas ignora as unidades no tamanho do arquivo ao classificar.
Benjamin Engwall