Como obtenho o tamanho de um diretório na linha de comando?

1065

Eu tentei obter o tamanho de um diretório (contendo diretórios e subdiretórios) usando o lscomando com a opção l. Parece funcionar para arquivos ( ls -l file name), mas se eu tentar obter o tamanho de um diretório (por exemplo ls -l /home), recebo apenas 4096 bytes, embora, ao todo, seja muito maior.

Abdul Al Hazred
fonte
18
1) Estritamente falando, você não pode. O Linux tem diretórios, não pastas. 2) Há uma diferença entre o tamanho de um diretório (que é um arquivo especial contendo inodes que apontam para outros arquivos) e o tamanho do conteúdo desse diretório. Como outros já apontaram, o comando du fornece o último, que é o que parece que você deseja.
jamesqf
11
como você parece ser novo, apenas apontarei a -hopção útil que você pode adicionar à -lopção (por exemplo, ls -lh) para obter os tamanhos dos arquivos a serem impressos em notação amigável para o ser humano, como 1,1 milhão em vez de 1130301. O "h "no du -hscomando que o @sam deu como resposta para sua pergunta sobre diretórios também significa" legível por humanos "e também aparece no df -hqual mostra as quantidades legíveis por humanos de espaço usado e livre em disco.
msouth

Respostas:

1490

du -sh file_path

Explicação

  • duO comando ( d isc u sage) estima o uso do espaço file_path
  • As opções -shsão (de man du):

      -s, --summarize
             display only a total for each argument
    
      -h, --human-readable
             print sizes in human readable format (e.g., 1K 234M 2G)
    

    Para verificar mais de um diretório e ver o total, use du -sch:

      -c, --total
             produce a grand total
    
sam
fonte
44
... a menos que você tenha hardlinks ;-) stackoverflow.com/questions/19951883/…
Rmano
15
Este é o tipo de resposta que eu amo <3 É resumidas e uma espécie de introdução ao comando due também você dar o caminho de pesquisa para obter mais detalhes man du...
Dica para os fabricantes de Unix-like: Da próxima vez, basta fazer comando "DiskUsage" em primeiro lugar, ou talvez até mesmo "o uso do disco" ... então o atalho ...;)
jave.web
Funciona muito bem com, find por exemplo, contar a quantidade de espaço em subdiretórios específicos no caminho atual: $ find . -type d -name "node_modules" -prune -exec du -sh {} \;
Alex Glukhovtsev
321

Basta usar o ducomando:

du -sh -- *

fornecerá o uso cumulativo do disco de todos os diretórios, arquivos etc. não ocultos no diretório atual em formato legível por humanos.

Você pode usar o dfcomando para conhecer o espaço livre no sistema de arquivos que contém o diretório:

df -h .
Pacifista
fonte
4
du -sh *começa a lançar erros de "opção desconhecida" se algum dos arquivos nesse diretório começar com um traço. Mais seguro para fazerdu -sh -- *
MPEN
1
du -sh *não mostra usos de memória de pastas ocultas
Prashant Singh Prabhakar
4
du -sh -- * .*para incluir arquivos de ponto. Isso é útil para incluir um .gitdiretório possivelmente grande , por exemplo. Como alternativa, no zsh, você pode setopt globdotsfazer glob dotfiles por padrão.
Cbarrick 29/11/16
1
O que --faz? Eu sei que isso se aplica aos built-ins do shell para encerrar os argumentos das opções, mas dunão é um built-in e não vejo esse uso documentado para du: linux.die.net/man/1/du
flow2k
Às vezes, você deseja adicionar -b( --apparent-size)
qualificado em
196

dué seu amigo. Se você quer apenas saber o tamanho total de um diretório, entre nele e execute:

du -hs

Se você também gostaria de saber quais subpastas ocupam quanto espaço em disco ?! Você pode estender este comando para:

du -h --max-depth=1 | sort -hr

que fornecerá o tamanho de todas as subpastas (nível 1). A saída será classificada (maior pasta na parte superior).

Chrispie
fonte
Parece que em algumas versões (talvez mais antigas?) Do linux, o sort não possui uma opção h e, portanto, o próximo melhor comando que pude encontrar é: du -c --max-depth = 1 | sort -rn
richhallstoke
@richhallstoke, se você usar ncduos arquivos, será classificado por tamanho decrescente por padrão.
Armfoot
3
+1 para o "| sort -hr"
afranques
67

dupode ser complicado de usar, pois você precisa passar 100 argumentos para obter uma saída decente. E descobrir o tamanho das pastas ocultas é ainda mais difícil.

Facilite sua vida e use-ancdu .

ncdu

Você obtém resumos por pasta que são facilmente navegáveis.

Teque5
fonte
9
Essa deve ser a resposta correta, pelo menos para aqueles que podem instalar o software no sistema. Infelizmente, acho que a maioria das pessoas não vai rolar o suficiente para ver isso.
DavidR
@ RickyNotaro-Garcia Não, isso ignora objetos ocultos e trava em diretórios grandes. Pode ser possível que exista uma solução OK com uma dúzia de tubos, mas por que desperdiçar sua vida.
Teque5
@ RickyNotaro-Garcia Leia todo o meu comentário: sua tentativa ignora objetos ocultos e trava em grandes diretórios.
Teque5
2
ncdué ótimo, eu sempre procuro esse comando quando esqueço. É rápido, fácil de navegar e ajuda a encontrar grandes pastas facilmente. Para sua informação, também está disponível para o macOS e provavelmente para todas as máquinas Linux.
Lukas
..e você pode excluir pastas diretamente ncdupressionando a dtecla
ccpizza
32

Outros já mencionaram du, mas eu também gostaria de mencionar o Ncdu - que é uma versão ncurses due fornece interatividade: você pode explorar a hierarquia de diretórios diretamente e ver os tamanhos dos subdiretórios.

Tblue
fonte
26

O ducomando mostra o uso do disco do arquivo.

A -hopção mostra os resultados na forma legível por humanos (por exemplo, 4k, 5M, 3G).

du -h (file name)
jackotonye
fonte
22

Todos os exemplos acima informam o tamanho dos dados no disco (ou seja, a quantidade de espaço em disco que um arquivo específico está usando, que geralmente é maior que o tamanho real do arquivo). Existem algumas situações em que isso não fornece um relatório preciso, se os dados não forem realmente armazenados nesse disco específico e existirem apenas referências de inode.

No seu exemplo, você usou ls -l em um único arquivo, que retornará o tamanho real do arquivo, NÃO o tamanho no disco.

Se você quiser saber o tamanho real do arquivo, adicione a opção -b ao du.

du -csbh .
Andy Foster
fonte
Sim. Estou usando sdfs que comprime e deduz os arquivos, então não consegui descobrir por que estava relatando números tão baixos. O tamanho real dos arquivos com ls pode ser encontrado usando: du -b
Ryan Shillington
15

pessoalmente, acho que isso é melhor, se você não quiser usar ncdu

# du -sh ./*
ConnerMan
fonte
14
df -h .; du -sh -- * | sort -hr

Isso mostra quanto espaço em disco resta na unidade atual e informa quanto cada arquivo / diretório ocupa. por exemplo,

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb2       206G  167G   29G  86% /
115M    node_modules
2.1M    examples
68K     src
4.0K    webpack.config.js
4.0K    README.md
4.0K    package.json
mpen
fonte
Para sua informação, parece relatar o tamanho em disco. ou seja, provavelmente será acolchoado para o 4KB mais próximo.
MPEN
9

Eu uso este comando como root :

sudo ls -1d */ | sudo xargs -I{} du {} -sh && sudo du -sh
Eduard Florinescu
fonte
9

encontre todos os arquivos no diretório atual recursivamente e resuma seu tamanho:

find -type f -print0 | xargs -0 stat --print='%s\n' | awk '{total+=$1} END {print total}'
Leon Chang
fonte
Eu usaria -not -type dpara somar não apenas tamanhos de arquivos comuns ( -type f), mas também tamanhos de links simbólicos e assim por diante.
anton_rh 24/09
Isso é ótimo, porque você não recebe a sobrecarga necessária para armazenar os arquivos, mas apenas o tamanho dos próprios arquivos.
bballdave025
9

Aqui está uma função para suas .bash_aliases

# du with mount exclude and sort
function dusort () {
    DIR=$(echo $1 | sed 's#\/$##')
    du -scxh $(mount | awk '{print $3}' | sort | uniq \
     | sed 's#/# --  exclude=/#') $DIR/* | sort -h
}

saída de amostra:

$ dusort /
...
0       /mnt  
0       /sbin
0       /srv
4,0K    /tmp
728K    /home
23M     /etc
169M    /boot  
528M    /root
1,4G    /usr
3,3G    /var
4,3G    /opt
9,6G    total

para subdiretórios:

$ dusort .
$ dusort /var/log/
feldversuch
fonte
7

Mais uma variante:

du -h --max-dep=1
0x8BADF00D
fonte
6

Observe que duimprime o espaço que um diretório ocupa na mídia, geralmente maior do que apenas o tamanho total de todos os arquivos do diretório, porque duleva em consideração o tamanho de todas as informações auxiliares armazenadas na mídia para organizar o diretório em conformidade com formato de sistema de arquivos.

Se o sistema de arquivos for compactável, dupoderá gerar um número ainda menor que o tamanho total de todos os arquivos, porque os arquivos podem ser compactados internamente pelo sistema de arquivos e, portanto, ocupam menos espaço na mídia do que apenas as informações não compactadas que contêm. Mesmo se houver arquivos esparsos.

se houver links físicos no diretório, também dupoderá imprimir um valor menor, porque vários arquivos diferentes no diretório referem os mesmos dados na mídia.

Para obter o tamanho total direto de todos os arquivos no diretório, a seguinte expressão shell de uma linha pode ser usada (assumindo um sistema GNU):

find . ! -type d -print0 | xargs -r0 stat -c %s | paste -sd+ - | bc

ou ainda mais curto:

find . ! -type d -printf '%s\n' | paste -sd+ - | bc

Apenas soma tamanhos de todos os arquivos que não são de diretório no diretório (e seus subdiretórios recursivamente) um por um. Observe que, para links simbólicos, ele informa o tamanho do link simbólico (não do arquivo apontado pelo link simbólico).

anton_rh
fonte
5

Você pode usar

du -sh directory/

e

du -sh filename

conhecer o espaço ocupado pela pasta ou arquivo.

df -h

mostrará o uso do disco no formato legível por humanos - h faz isso.

Há também um programa gui chamado Disk Usage Analyzer.

arupgsh
fonte
5

Aqui está um script POSIX que funcionará com:

  • Um arquivo
  • arquivos
  • Um diretório
  • Diretórios
#!/bin/sh
ls -ARgo "$@" | awk '{q += $3} END {print q}'

Fonte

Steven Penny
fonte