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

163

Procurando por uma série de comandos que mostrará os maiores arquivos em uma unidade.

    
por Ryan Detzel 20.04.2011 / 16:01

10 respostas

230

Se você só precisar encontrar arquivos grandes, poderá usar find com a opção -size . O próximo comando listará todos os arquivos maiores que 10MiB ( para não ser confundido com 10MB ):

find / -size +10M -ls

Se você quiser encontrar arquivos entre um determinado tamanho, poderá 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 de disco. Um aplicativo que parece muito promissor é o gt5 .

A partir da descrição do pacote:

Years have passed and disks have become larger and larger, but even on this incredibly huge harddisk era, the space seems to disappear over time. This small and effective programs provides more convenient listing than the default du(1). It displays what has happened since last run and displays dir size and the total percentage. It is possible to navigate and ascend to directories by using cursor-keys with text based browser (links, elinks, lynx etc.)

Naseção"pacotes relacionados" do gt5 , encontrei ncdu . A partir da descrição do pacote:

Ncdu is a ncurses-based du viewer. It provides a fast and easy-to-use interface through famous du utility. It allows to browse through the directories and show percentages of disk usage with ncurses library.

    
por Lekensteyn 20.04.2011 / 16:16
29

Eu apenas uso uma combinação de du e 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ágüe e repita . Segmente os subdiretórios que você acha que são muito grandes, execute o comando para eles e descubra o que está causando o problema.

Nota: Eu uso du ' -x sinalizador para manter as coisas limitadas a um sistema de arquivos (eu tenho um arranjo bastante complicado de coisas montadas em cruz entre SSD e RAID5).

Nota 2: 2>/dev/null redireciona qualquer mensagem de erro para o esquecimento. Se eles não te incomodam, não é obrigatório.

    
por Oli 20.04.2011 / 16:30
18

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

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

du argumentos:

  • -a para arquivos e diretórios "all". Deixe por apenas diretórios
  • -BM para produzir os tamanhos em megabytes (M) 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 menor)

head argumentos:

  • -n 50 para os primeiros 50 resultados.
  • Deixe de fora more se estiver usando um número menor

Nota: prefixe com sudo para 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
    
por Dan King 04.07.2015 / 01:24
8

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

uma versão muito mais rápida usando find sem gerar processos 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

    
por kon 16.11.2011 / 13:55
7

Para exibir os maiores diretórios top-20 (recursivamente) na pasta atual, use o seguinte one-liner:

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

ou (mais orientado para Unix):

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

Para os 20 maiores arquivos no 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

Please note that -h is available for GNU sort only, so to make it work on OSX/BSD properly, you've to install it from coreutils. Then add its folder into your PATH.

Portanto, esses aliases são úteis em seus 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'
    
por kenorb 05.03.2015 / 15:17
6

Esta parece ser a aplicação perfeita para find :

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

Este comando encontrará todos os arquivos no diretório $DIRECTORY e executará ls -s neles. O último comando imprime o tamanho alocado de um arquivo mais o nome do arquivo. O resultado é classificado numericamente e as últimas cinco entradas são mostradas. Como resultado, você verá os 5 arquivos maiores em $DIRETORY ou qualquer subdiretório. Se você inserir tail -n 1 , verá apenas o arquivo maior.

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

    
por qbi 20.04.2011 / 16:26
3

Quando eu preciso criar mais espaço livre em servidores, eu uso esse comando. Ele encontra todos os arquivos maiores que 50 MB e "du -h" faz uma lista melhor de arquivos e "sort -n" depois que o pipe faz a lista numericcaly ordenada por tamanho de arquivo.

find / -size +50M -type f -exec du -h {} \; | sort -n
    
por zorbon.cz 11.10.2014 / 22:40
1

Experimente o Baobab, ele fornece uma visão geral gráfica de arquivos e pastas, você pode ver onde estão os verdadeiros chefes de espaço e excluí-los com um clique link

    
por Oliver Hoffmann 29.01.2013 / 12:47
1

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

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

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

    
por dermen 11.06.2013 / 21:04
0

blanktest - pasta vazia

test - pasta a ser excluída

rsync -a --delete blanktest/ test/
    
por HBian 22.05.2014 / 13:06
0

Você também pode classificar arquivos por tamanho:

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

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

O último arquivo impresso é o maior.

    
por Peregring-lk 08.09.2016 / 14:28