O que é uma maneira de linha de comando para encontrar arquivos / diretórios grandes para remover e liberar espaço?

203

Procurando por uma série de comandos que me mostrem os maiores arquivos de uma unidade.

Ryan Detzel
fonte
Algo gráfico seria bom?
RolandiXor
5
não, executando na linha de comando sobre ssh.
precisa saber é o seguinte
O estranho é que eu tenho dois servidores executando a mesma coisa. Um deles usa 50% de disco e o outro 99%. Não consigo encontrar o que está causando isso.
Ryan Detzel
Então, eu estou confuso, ele diz que 98% usado com du mas quando eu executar o aplicativo gt5 eu recebo: grab.by/9Vv2
Ryan Detzel

Respostas:

276

Se você só precisa encontrar arquivos grandes, pode usar findcom a -sizeopção O próximo comando listará todos os arquivos maiores que 10MiB ( não confunda com 10MB ):

find / -size +10M -ls

Se você deseja encontrar arquivos entre um determinado tamanho, é possível combiná-lo com uma pesquisa "tamanho menor que". O próximo comando encontra arquivos entre 10MiB e 12MiB:

find / -size +10M -size -12M -ls

apt-cache search 'disk usage'lista alguns programas disponíveis para análise de uso do disco. Um aplicativo que parece muito promissor é gt5.

Na descrição do pacote:

Os anos se passaram e os discos tornaram-se cada vez maiores, mas mesmo nesta era incrivelmente grande do disco rígido, o espaço parece desaparecer com o tempo. Esses programas pequenos e eficazes fornecem uma listagem mais conveniente do que o du (1) padrão. Ele exibe o que aconteceu desde a última execução e exibe o tamanho do diretório e a porcentagem total. É possível navegar e subir para diretórios usando teclas de cursor com navegador baseado em texto (links, elinks, lynx etc.)

Captura de tela do gt5

Na seção "pacotes relacionados" do gt5 , eu encontrei ncdu. Na descrição do pacote:

Ncdu é um visualizador baseado em ncurses. Ele fornece uma interface rápida e fácil de usar através do famoso utilitário du. Ele permite navegar pelos diretórios e mostrar porcentagens de uso do disco com a biblioteca ncurses.

Captura de tela do ncdu

Lekensteyn
fonte
3
ncdu é muito rápido e exatamente o que eu precisava, obrigado! Eu tentei gt5 também, mas apenas cancelada porque foi "pensar" muito longo w / o qualquer feedback
Lukas
7
Caramba, ncdu é incrível, obrigado por compartilhar suas descobertas!
Enquanto-E
Eu adoraria se ncdu fosse apontado mais forte. Preciso de vez em quando e não consigo lembrar o nome.
Martin Thoma 12/09
Chega de lembrar comandos graças a ncdu :)
Mr Coder
1
@ Matt Não, o formato de saída para a -lssaída é codificado (ver o código fonte pred_flse list_file funções). Você pode tentar aproximar a saída usando a -printfopção, pós-processar a saída com awk ou usar algo comofind ... -type f -exec ls -ldh {} \; | column -t
Lekensteyn
33

Eu apenas uso uma combinação de due sort.

sudo du -sx /* 2>/dev/null | sort -n

0   /cdrom
0   /initrd.img
0   /lib64
0   /proc
0   /sys
0   /vmlinuz
4   /lost+found
4   /mnt
4   /nonexistent
4   /selinux
8   /export
36  /media
56  /scratchbox
200 /srv
804 /dev
4884    /root
8052    /bin
8600    /tmp
9136    /sbin
11888   /lib32
23100   /etc
66480   /boot
501072  /web
514516  /lib
984492  /opt
3503984 /var
7956192 /usr
74235656    /home

Então é um caso de enxágue e repita . Segmente os subdiretórios que você considera grandes demais, execute o comando para eles e descubra o que está causando o problema.

Nota: Eu uso duo -xsinalizador para manter as coisas limitadas a um sistema de arquivos (eu tenho um arranjo bastante complicado de coisas montadas em conjunto entre SSD e RAID5).

Nota 2: 2>/dev/nullredireciona todas as mensagens de erro para o esquecimento. Se eles não incomodam você, não é obrigatório.

Oli
fonte
1
Quando executo esse comando, desce nos diretórios filhos. Na dupágina do manual: "Resuma o uso do disco de cada ARQUIVO, recursivamente para diretórios".
Jamie
26

Minha solução favorita usa uma combinação de várias dessas boas respostas.

du -aBM 2>/dev/null | sort -nr | head -n 50 | more

du argumentos:

  • -apara "todos" arquivos e diretórios. Deixe para apenas diretórios
  • -BM para produzir os tamanhos em megabytes (M) de tamanhos de bloco (B)
  • 2>/dev/null - excluir mensagens de erro "permissão negada" (obrigado @Oli)

sort argumentos:

  • -n para "numérico"
  • -r para "reverso" (maior para o menor)

head argumentos:

  • -n 50 pelos 50 melhores resultados.
  • Pare se moreestiver usando um número menor

Nota: Prefixe com sudopara incluir diretórios que sua conta não tem permissão para acessar.

Exemplo mostrando os 10 maiores arquivos e diretórios em / var (incluindo o total geral).

cd /var
sudo du -aBM 2>/dev/null | sort -nr | head -n 10
7555M   .
6794M   ./lib
5902M   ./lib/mysql
3987M   ./lib/mysql/my_database_dir
1825M   ./lib/mysql/my_database_dir/a_big_table.ibd
997M    ./lib/mysql/my_database_dir/another_big_table.ibd
657M    ./log
629M    ./log/apache2
587M    ./log/apache2/ssl_access.log
273M    ./cache
Dan King
fonte
10

A resposta do qbi está correta, mas será muito lenta quando houver muitos arquivos, pois iniciará um novo processo ls para cada item.

uma versão muito mais rápida usando processos filhos sem gerar filhos seria usar printf para imprimir o tamanho em bytes (% s) e o caminho (% p)

find "$directory" -type f -printf "%s - %p\n" | sort -n | tail -n $num_entries

kon
fonte
1
Confirmar que esta é muito mais rápido
Cookies
10

Para exibir os 20 principais diretórios principais (recursivamente) na pasta atual, use a seguinte linha:

du -ah . | sort -rh | head -20

ou (mais orientado para Unix):

du -a . | sort -rn | head -20

Para os 20 maiores arquivos do diretório atual (recursivamente):

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

ou com tamanhos legíveis por humanos:

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Observe que -hestá disponível sortapenas para GNU ; portanto, para fazê-lo funcionar corretamente no OSX / BSD, você deve instalá-lo coreutils. Em seguida, adicione sua pasta ao seu PATH.

Portanto, esses aliases são úteis nos arquivos rc (sempre que você precisar):

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'
kenorb
fonte
8

Parece ser o aplicativo perfeito para find:

find $DIRECTORY -type f -exec ls -s {} \; | sort -n | tail -n 5

Este comando encontrará todos os arquivos no diretório $DIRECTORYe será executado ls -sneles. O último comando imprime o tamanho alocado de um arquivo mais o nome do arquivo. O resultado é classificado numericamente e as cinco últimas entradas são mostradas. Portanto, como resultado, você verá os cinco maiores arquivos $DIRETORYou em qualquer subdiretório. Se você digitar, tail -n 1verá apenas o maior arquivo.

Além disso, você pode brincar muito com find. Por exemplo, você pode procurar arquivos com menos de n dias ( -ctime -n) ou pertencentes a usuários especiais ( -user johndoe).

qbi
fonte
5

Quando preciso liberar mais espaço nos servidores, uso este comando. Ele encontra todos os arquivos maiores que 50 MB e "du -h" cria uma lista melhor de arquivos e "sort -n" após o pipe torna a lista classificada numericamente por tamanho de arquivo.

find / -size +50M -type f -exec du -h {} \; | sort -n
zorbon.cz
fonte
1

Experimente o Baobab, ele fornece uma visão geral gráfica de arquivos e pastas, você pode ver onde estão os porcos do espaço real e excluí-los com um clique https://help.ubuntu.com/community/Baobab

Oliver Hoffmann
fonte
2
Nesta pergunta em particular, o OP prefere um método de linha de comando. Veja os comentários à pergunta. Também vou editar a pergunta.
1

Para encontrar todos os arquivos GB, por exemplo, eu usaria du e grep, embora os outros métodos mencionados aqui pareçam ótimos também.

du -h -a /dir | grep "[0-9]G\b"  

Você também pode gostar da opção --except que du possui.

dermen
fonte
0

Você também pode classificar os arquivos por tamanho:

find . -type f -exec du -h {} \; | sort -k1 -h

Ele encontra apenas arquivos e é executado du -hpara cada arquivo, o que mostra o tamanho do arquivo. Por fim, classificamos a saída de find/ de duacordo com a primeira coluna (em formato legível por humanos).

O último arquivo impresso é o maior.

Peregring-lk
fonte
0

Você pode usar o comando para ver os maiores arquivos enquanto ignora os diretórios:

sudo find / -type f -printf “%s\t%p\n” | sort -n | tail -1
find $HOME -type f -printf ‘%s %p\n’ | sort -nr | head -10

Para encontrar todos os arquivos maiores que 100MiB (isso não é 100MB, veja aqui se você estiver confuso):

find / -size +100M -ls

o comando abaixo exibirá os 5 maiores arquivos da pasta $DIRECTORY:

find $DIRECTORY -type f -exec ls -s {} \; | sort -n | tail -n 5

USANDO du: O comando abaixo, que usa du, exibe os diretórios com os 20 maiores tamanhos na pasta de trabalho:

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

Agora, para exibir agora os maiores diretórios / arquivos, incluindo subpastas, execute:

du -Sh | sort -rh | head -n 10

Usando ls:

Para listar os 5 principais arquivos maiores no diretório / bin, emita o comando abaixo:

ls -lSh /bin | head -5

Você também pode usar o Disk Usage Analyzer ou o Baobao, como mostrado aqui, por exemplo.

Zezo
fonte
0

Uma ferramenta excelente e fácil de usar referida na resposta a uma pergunta semelhante é a NCurses Disk Usageferramenta:

sudo ncdu /
janoside
fonte
Bem, começar pela raiz do sistema de arquivos era exatamente o oposto de inútil para mim. Permitiu-me identificar os locais mais importantes para economizar espaço em todo o sistema de arquivos. Independentemente disso, você pode usar o mencionado para iniciar em qualquer diretório. Confira os documentos dessa ferramenta. Mas, conforme solicitado, aqui está o link para a resposta da fonte .
janoside 11/09