Rastrear onde o espaço em disco passou no Linux?

462

Ao administrar sistemas Linux, muitas vezes me vejo lutando para rastrear o culpado depois que uma partição fica cheia. Eu normalmente uso du / | sort -nr , mas em um sistema de arquivos grande isso leva muito tempo até que os resultados sejam retornados.

Além disso, isso geralmente é bem-sucedido ao destacar o pior ofensor, mas muitas vezes me deparei com du sem o sort em casos mais sutis e, em seguida, teve que vasculhar a saída.

Eu prefiro uma solução de linha de comando que se baseia em comandos padrão do Linux, já que tenho que administrar vários sistemas e instalar um novo software é uma complicação (especialmente quando falta espaço no disco!)

    
por Anderson 28.08.2008 / 15:17

36 respostas

491

Teste ncdu , um excelente analisador de uso de disco de linha de comando:

    
por 13.04.2011 / 12:36
317

Não vá direto para du / . Use df para encontrar a partição que está prejudicando você e, em seguida, experimente os comandos du .

Um que eu gosto de experimentar é

# U.S.
du -h <dir> | grep '[0-9\.]\+G'
# Others
du -h <dir> | grep '[0-9\,]\+G'

porque imprime tamanhos em "formato legível por humanos". A menos que você tenha partições realmente pequenas, o grepping para diretórios nos gigabytes é um filtro muito bom para o que você deseja. Isso levará algum tempo, mas a menos que você tenha as cotas configuradas, acho que é assim que vai ser.

Como @jchavannes aponta nos comentários, a expressão pode ficar mais precisa se você encontrar muitos falsos positivos. Eu incorporei a sugestão, o que a torna melhor, mas ainda há falsos positivos, então há apenas tradeoffs (expr mais simples, piores resultados; mais complexos e mais longos, melhores resultados). Se você tem muitos diretórios pequenos aparecendo na sua saída, ajuste seu regex de acordo. Por exemplo,

grep '^\s*[0-9\.]\+G'

é ainda mais preciso (não serão listados diretórios de < 1 GB).

Se você fizer tiver cotas, poderá usar

quota -v

para encontrar usuários que estão sobrecarregando o disco.

    
por 28.08.2008 / 15:25
101

Ambos GNU du e BSD du pode ter restrição de profundidade ( mas POSIX du não pode! ):

  • GNU (Linux,…):

    du --max-depth 3
    
  • BSD (macOS,…):

    du -d 3
    

Isso limitará a exibição da saída à profundidade 3. O tamanho calculado e exibido ainda é o total da profundidade total, é claro. Mas, apesar disso, restringir a profundidade da tela acelera drasticamente o cálculo.

Outra opção útil é -h (palavras no GNU e no BSD, mas, mais uma vez, não no% POS_de du POSIX) para saída “legível por humanos” (ou seja, usando KiB, MiB etc. ).

    
por 28.08.2008 / 15:19
48

Você também pode executar o seguinte comando usando du :

~# du -Pshx /* 2>/dev/null
  • A opção -s resume e exibe o total de cada argumento.
  • h imprime Mio, Gio, etc.
  • x = fica em um sistema de arquivos (muito útil).
  • P = não segue links simbólicos (o que pode fazer com que os arquivos sejam contados duas vezes, por exemplo).

Tenha cuidado, o diretório /root não será mostrado, você tem que executar ~# du -Pshx /root 2>/dev/null para conseguir isso (uma vez, eu lutei muito não apontando que meu diretório /root estava cheio).

Editar: opção corrigida -P

    
por 13.05.2013 / 22:51
27

Encontrar os maiores arquivos no sistema de arquivos sempre levará muito tempo. Por definição você tem que percorrer todo o sistema de arquivos procurando por arquivos grandes. A única solução é provavelmente executar uma tarefa cron em todos os seus sistemas para ter o arquivo pronto antes do tempo.

Uma outra coisa, a opção x de du é útil para evitar que os pontos de montagem sejam seguidos em outros sistemas de arquivos. Ou seja:

du -x [path]

O comando completo que geralmente executo é:

sudo du -xm / | sort -rn > usage.txt

O -m significa resultados de retorno em megabytes e sort -rn classificará primeiro o maior número de resultados. Você pode então abrir o arquivo usage.txt em um editor, e as maiores pastas (começando com /) estarão no topo.

    
por 28.08.2008 / 15:27
19

Eu sempre uso du -sm * | sort -n , o que dá a você uma lista ordenada de quanto os subdiretórios do diretório de trabalho atual usam, em mebibytes.

Você também pode tentar o Konqueror, que tem um modo de "visualização de tamanho", que é semelhante ao que o WinDirStat faz no Windows: ele fornece uma representação visual de quais arquivos / diretórios usam a maior parte do espaço.

Atualização: em versões mais recentes, você também pode usar du -sh * | sort -h , que mostrará os arquivos legíveis por humanos e ordenará por eles. (os números serão sufixados com K, M, G, ...)

Para quem procura uma alternativa para a visualização do tamanho de arquivo do KDE3, o Konqueror pode dar uma olhada no filelight, embora não seja tão bom assim.

    
por 28.08.2008 / 15:33
17

Eu uso isso para os 25 piores criminosos abaixo do diretório atual

# -S to not include subdir size, sorted and limited to top 25
du -S . | sort -nr | head -25
    
por 08.07.2010 / 10:58
14

Em uma empresa anterior, tínhamos um trabalho cron que era executado durante a noite e identificávamos arquivos de um determinado tamanho, por exemplo

encontre / tamanho + 10000k

Você pode querer ser mais seletivo sobre os diretórios que está pesquisando e ficar atento a qualquer unidade montada remotamente que possa ficar off-line.

    
por 06.09.2008 / 17:01
10

Uma opção seria executar o seu comando du / sort como uma tarefa cron e gerar uma saída para um arquivo, para que ele já esteja lá quando você precisar.

    
por 28.08.2008 / 15:20
9

Para a linha de comando, acho que o método du / sort é o melhor. Se você não está em um servidor, você deve dar uma olhada em Baobab - Disk usage analyzer . Este programa também leva algum tempo para ser executado, mas você pode facilmente encontrar o subdiretório deep, bem fundo onde estão todos os antigos ISOs do Linux.

    
por 28.08.2008 / 21:20
9

eu uso

du -ch --max-depth=2 .

e eu mudo a profundidade máxima para atender às minhas necessidades. A opção "c" imprime os totais das pastas e a opção "h" imprime os tamanhos em K, M ou G, conforme apropriado. Como outros disseram, ele ainda verifica todos os diretórios, mas limita a saída de uma maneira que eu acho mais fácil de encontrar os diretórios grandes.

    
por 29.08.2008 / 22:22
8

Vou para o segundo xdiskusage . Mas vou adicionar na nota que é realmente um du frontend e pode ler o du output de um arquivo. Portanto, você pode executar du -ax /home > ~/home-du em seu servidor, scp do arquivo e analisá-lo graficamente. Ou canalizá-lo através do ssh.

    
por 02.12.2008 / 17:20
6

Tente alimentar a saída de du em um script awk simples que verifica se o tamanho do diretório é maior que algum limite, se for o caso, imprime. Você não precisa esperar para que a árvore inteira seja percorrida antes de começar a obter informações (em comparação com muitas outras respostas).

Por exemplo, o seguinte exibe todos os diretórios que consomem mais de cerca de 500 MB.

du -kx / | awk '{ if ($1 > 500000) { print $0} }'

Para tornar o acima um pouco mais reutilizável, você pode definir uma função em seu .bashrc (ou você pode transformá-lo em um script independente).

dubig() {
    [ -z "$1" ] && echo "usage: dubig sizethreshMB [dir]" && return
    du -kx $2 | awk '{ if ($1 > '$1'*1024) { print $0} }'
}

Portanto, dubig 200 ~/ aparece no diretório inicial (sem seguir os symlinks do dispositivo) para diretórios que usam mais de 200 MB.

    
por 28.08.2008 / 15:50
4

Eu gosto do bom e velho xdiskusage como uma alternativa gráfica ao du (1).

    
por 28.08.2008 / 16:46
4

Eu prefiro usar o seguinte para obter uma visão geral e detalhar a partir daí ...

cd /folder_to_check
du -shx */

Isso exibirá resultados com saída legível por humanos, como GB, MB. Também impedirá a travessia através de sistemas de arquivos remotos. A opção -s mostra apenas o resumo de cada pasta encontrada, para que você possa aprofundar ainda mais se estiver interessado em mais detalhes de uma pasta. Tenha em mente que esta solução só mostrará pastas, assim você vai querer omitir o / após o asterisco se você quiser arquivos também.

    
por 08.02.2013 / 14:28
4

Não mencionado aqui, mas você também deve verificar o lsof no caso de arquivos excluídos / suspensos. Eu tinha um arquivo tmp excluído 5.9GB de um cronjob fugir.

link Ajudou-me a encontrar o dono do processo do dito arquivo (cron) e então eu fui capaz de ir /proc/{cron id}/fd/{file handle #} menos o arquivo em questão para obter o início da fuga, resolver isso e, em seguida, echo "" > arquivo para limpar o espaço e deixar o cron fechar-se graciosamente.

    
por 15.06.2013 / 19:59
2

Para a linha de comando du (e suas opções) parece ser o melhor caminho. DiskHog parece que usa du / df info de um cron job também, então A sugestão de Peter é provavelmente a melhor combinação de simples e eficaz.

( FileLight e KDirStat são ideais para GUI.

    
por 28.08.2008 / 15:24
2

Você pode usar ferramentas padrão como find e sort para analisar o uso do espaço em disco.

Listar os diretórios classificados por seu tamanho:

find / -mount -type d -exec du -s "{}" \; | sort -n

Listar arquivos classificados por tamanho:

find / -mount -printf "%k\t%p\n" | sort -n
    
por 06.10.2016 / 10:53
2

A partir do terminal, você pode obter uma representação visual do uso do disco com dutree

É muito rápido e leve porque é implementado em Rust

$dutree-hUsage:dutree[options]<path>[<path>..]Options:-d,--depth[DEPTH]showdirectoriesuptodepthN(def1)-a,--aggr[N[KMG]]aggregatesmallerthanNB/KiB/MiB/GiB(def1M)-s,--summaryequivalentto-da,or-d1-a1M-u,--usagereportrealdiskusageinsteadoffilesize-b,--bytesprintsizesinbytes-f,--files-onlyskipdirectoriesforafastlocaloverview-x,--excludeNAMEexcludematchingfilesordirectories-H,--no-hiddenexcludehiddenfiles-A,--asciiASCIIcharactersonly,nocolors-h,--helpshowhelp-v,--versionprintversionnumber

Vejatodososdetalhesdeusono site

    
por 03.05.2018 / 11:17
1

Primeiro, eu verifico o tamanho dos diretórios, da seguinte forma:

du -sh /var/cache/*/
    
por 08.09.2008 / 21:12
1

Se você sabe que os arquivos grandes foram adicionados nos últimos dias (digamos, 3), você pode usar um comando de localização em conjunto com " ls -ltra " para descobrir os arquivos adicionados recentemente:

find /some/dir -type f -mtime -3 -exec ls -lart {} \;

Isto lhe dará apenas os arquivos (" -type f "), não diretórios; apenas os arquivos com tempo de modificação nos últimos 3 dias (" -mtime -3 ") e execute " ls -lart " em cada arquivo encontrado (parte " -exec ").

    
por 12.03.2009 / 15:48
1

Para entender o uso desproporcional de espaço em disco, geralmente é útil começar pelo diretório raiz e percorrer alguns de seus maiores filhos.

Podemos fazer isso por

  • salvando a saída de du em um arquivo
  • percorrendo o resultado iterativamente

Isto é:

# sum up the size of all files and directories under the root filesystem
du -a -h -x / > disk_usage.txt
# display the size of root items
grep $'\t/[^/]*$' disk_usage.txt

agora digamos que / usr pareça grande demais

# display the size of /usr items
grep $'\t/usr/[^/]*$' disk_usage.txt

agora se / usr / local for suspeitamente grande

# display the size /usr/local items
grep $'\t/usr/local/[^/]*$' disk_usage.txt

e assim por diante ...

    
por 17.12.2009 / 05:44
1

Eu usei este comando para encontrar arquivos maiores que 100Mb:

find / -size +100M -exec ls -l {} \;
    
por 23.07.2013 / 15:09
1

Vale a pena notar que mc (Midnight Commander, um gerenciador de arquivos clássico em modo texto) por padrão mostra apenas o tamanho do diretório inodes (geralmente 4096 ) mas com Ctrl < kbd> Espaço ou com o menu Ferramentas você pode ver o espaço ocupado pelo diretório selecionado em um formato legível por humanos (por exemplo, alguns como 103151M ).

Por exemplo, a imagem abaixo mostra o tamanho total das distribuições do van TeX Live de 2018 e 2017, enquanto as versões de 2015 e 2016 mostram apenas o tamanho do inode (mas elas têm quase 5 GB cada).

Isto é, Ctrl Espaço deve ser feito um por um, somente para o nível real do diretório, mas é tão rápido e prático quando você está navegando com mc que talvez você não precise de ncdu (que de fato, somente para esse fim é melhor). Caso contrário, você também pode executar ncdu de mc . sem sair do mc ou iniciar outro terminal.

    
por 30.09.2018 / 23:16
0

Eu tive sucesso em rastrear os piores ofensores canalizando a saída du em formato legível para egrep e correspondendo a uma expressão regular.

Por exemplo:

du -h | egrep "[0-9]+G.*|[5-9][0-9][0-9]M.*"

que deve devolver tudo a 500 megas ou mais.

    
por 28.08.2008 / 16:53
0

Se você deseja velocidade, é possível ativar cotas nos sistemas de arquivos que deseja monitorar (não precisa definir cotas para nenhum usuário) e usar um script que use o comando quota para listar o espaço em disco que está sendo usado por cada usuário. Por exemplo:

quota -v $user | grep $filesystem | awk '{ print $2 }'

daria a você o uso do disco em blocos para o usuário em particular no sistema de arquivos específico. Você deve poder verificar os usos em questão de segundos dessa maneira.

Para ativar as cotas, você precisará adicionar o usrquota às opções do sistema de arquivos em seu arquivo / etc / fstab e, provavelmente, reinicializar para que o quotacheck possa ser executado em um sistema de arquivos ocioso antes de citaron.

    
por 17.09.2008 / 16:35
0

Aqui está um pequeno aplicativo que usa amostragem profunda para encontrar tumores em qualquer disco ou diretório. Ele percorre a árvore de diretórios duas vezes, uma para medi-la e a segunda vez para imprimir os caminhos para 20 bytes "aleatórios" no diretório.

void walk(string sDir, int iPass, int64& n, int64& n1, int64 step){
    foreach(string sSubDir in sDir){
        walk(sDir + "/" + sSubDir, iPass, n, n1, step);
    }
    foreach(string sFile in sDir){
        string sPath = sDir + "/" + sFile;
        int64 len = File.Size(sPath);
        if (iPass == 2){
            while(n1 <= n+len){
               print sPath;
               n1 += step;
            }
        }
        n += len;
    }
}

void dscan(){
    int64 n = 0, n1 = 0, step = 0;
    // pass 1, measure
    walk(".", 1, n, n1);
    print n;
    // pass 2, print
    step = n/20; n1 = step/2; n = 0;
    walk(".", 2, n, n1);
    print n;
}

A saída é assim para o meu diretório Arquivos de Programas:

 7,908,634,694
.\ArcSoft\PhotoStudio 2000\Samples.jpg
.\Common Files\Java\Update\Base Images\j2re1.4.2-b28\core1.zip
.\Common Files\Wise Installation Wizard\WISDED53B0BB67C4244AE6AD6FD3C28D1EF_7_0_2_7.MSI
.\Insightful\splus62\java\jre\lib\jaws.jar
.\Intel\Compiler\Fortran.1\em64t\bin\tselect.exe
.\Intel\Download\IntelFortranProCompiler91\Compiler\Itanium\Data1.cab
.\Intel\MKL.0.1\em64t\bin\mkl_lapack32.dll
.\Java\jre1.6.0\bin\client\classes.jsa
.\Microsoft SQL Server\Setup Bootstrap\sqlsval.dll
.\Microsoft Visual Studio\DF98\DOC\TAPI.CHM
.\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows CE\sqlce20sql2ksp1.exe
.\Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\docs\Partition II Metadata.doc
.\Microsoft Visual Studio .NET 2003\Visual Studio .NET Enterprise Architect 2003 - English\Logs\VSMsiLog0A34.txt
.\Microsoft Visual Studio 8\Microsoft Visual Studio 2005 Professional Edition - ENU\Logs\VSMsiLog1A9E.txt
.\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework.0\v2.0\WindowsCE\wce500\mipsiv\NETCFv2.wce5.mipsiv.cab
.\Microsoft Visual Studio 8\VC\ce\atlmfc\lib\armv4i\UafxcW.lib
.\Microsoft Visual Studio 8\VC\ce\Dll\mipsii\mfc80ud.pdb
.\Movie Maker\MUI09\moviemk.chm
.\TheCompany\TheProduct\docs\TheProduct User's Guide.pdf
.\VNI\CTT6.0\help\StatV1.pdf
7,908,634,694

Diz-me que o diretório é 7.9gb, dos quais

  • ~ 15% vai para o compilador Intel Fortran
  • ~ 15% vai para o VS .NET 2003
  • ~ 20% vai para o VS 8

É bastante simples perguntar se algum deles pode ser descarregado.

Ele também informa sobre os tipos de arquivos distribuídos no sistema de arquivos, mas juntos representam uma oportunidade para economia de espaço:

  • ~ 15% vai para arquivos .cab e .MSI
  • ~ 10% vai para o registro de arquivos de texto

Ele mostra muitas outras coisas lá também, que eu provavelmente poderia fazer sem, como suporte a "SmartDevices" e "ce" (~ 15%).

Leva tempo linear, mas não precisa ser feito com frequência.

Exemplos de coisas encontradas:

  • cópias de backup de DLLs em muitos repositórios de código salvos, que não precisam realmente precisam ser salvos
  • uma cópia de backup do disco rígido de alguém no servidor, em um diretório obscuro
  • volumosos arquivos temporários de internet
  • doc antigos e arquivos de ajuda muito antigos são necessários
por 09.02.2009 / 18:35
0

Eu tive um problema semelhante, mas as respostas nesta página não foram suficientes. Eu encontrei o seguinte comando para ser o mais útil para a listagem:

du -a / | sort -n -r | head -n 20

O que me mostraria os 20 maiores infratores. No entanto, mesmo que eu corri isso, não me mostrou o problema real, porque eu já tinha apagado o arquivo. O problema era que ainda havia um processo em execução que referenciava o arquivo de log excluído ... então tive que matar esse processo primeiro e depois o espaço em disco mostrou-se gratuito.

    
por 02.12.2014 / 23:59
0

Você pode usar DiskReport.net para gerar um relatório on-line de todos os seus discos.

Com muitas execuções, ele mostrará seu histórico para todas as suas pastas, fácil de encontrar o que cresceu

    
por 05.06.2015 / 23:38
0

Existe um belo freeware multiplataforma chamado JDiskReport que inclui uma GUI para explorar o que está ocupando esse espaço.

Exemplo de captura de tela:

Claro,vocêprecisarálimparumpoucodeespaçomanualmenteantesdefazerodownloadeinstalá-lo,oufazerodownloadparaumaunidadediferente(comoumpendriveUSB).

(Copiadoaquidomesmoautor resposta em questão duplicada)

    
por 06.10.2016 / 04:50