Encontre os maiores arquivos ou diretórios

10

Qual comando irá imprimir os tamanhos de todos os arquivos e diretórios no diretório tmp (incluindo os ocultos) e classificá-los por tamanhos de maior para o menor em formato legível por humanos (por exemplo, 2 GB)?

A saída pode ser a seguinte:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

Eu tentei usar os comandos ls e du , mas não consegui encontrar os switches certos.

    
por xralf 06.04.2011 / 20:21

6 respostas

7

Aqui está uma solução rápida, use du + sort. Tente isto:

du -smc * | sort -n

Isso ignorará arquivos ocultos, mas isso é outra solução fácil:

du -smc .[^.] .??* * | sort -n

Isso pode causar avisos se um ou mais dos padrões acima não corresponderem a um arquivo. O primeiro padrão .[^.] corresponde a todos os nomes de arquivos de dois caracteres que começam com. exceto para .., o segundo padrão, .??* corresponde a todos os três ou mais nomes de arquivos que começam com. e * corresponde a todos os arquivos que não estão começando. Para uma lista mais sofisticada, como localizar todos os arquivos maiores que X em um sistema de arquivos inteiro ou manter uma lista de crescimento do sistema de arquivos, tenho alguns scripts de shell DIY que escrevi e posso compartilhar se você tiver interesse.

    
por 06.04.2011 / 20:29
3

Para listar os arquivos em qualquer lugar abaixo de /tmp , classificados por tamanho:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

Para listar os arquivos e as árvores de diretórios imediatamente abaixo de /tmp , classificados por tamanho:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

Para listar todos os arquivos e árvores de diretórios em qualquer lugar em /tmp , classificado por tamanho:

du -ak /tmp | sort -k1n -k2

(Um exemplo para ilustrar a diferença entre os três comandos: se houver um arquivo /tmp/dir/file , o primeiro comando listará /tmp/dir/file , o segundo listará /tmp/dir e a terceira listará ambos.)

Todos os comandos acima mostram tamanhos em kilobytes. Enquanto o GNU du pode produzir tamanhos “legíveis por humanos” (com multiplicadores k, M, G, etc.), classificá-los é outra questão. Coreutils GNU recentes (≥7.4) podem bastar: basta substituir du -k por du -h e sort -k1n -k2 por sort -k1h -k2 . Caso contrário, aqui está um script awk bruto para converter em tamanhos com sufixo (arredondando para baixo); apenas canalize a saída sort acima para ela.

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'
    
por 06.04.2011 / 22:00
3

Estou usando o seguinte alias para ele: alias ds='du -x --all --max-depth=1 . | sort -n'

Imprime tamanhos de todos os arquivos e subdiretórios de nível 1 do diretório atual

    
por 07.04.2011 / 20:05
1

Com a versão atual do gnu sort (e emprestando o padrão de arquivo @ penguin359)

cd /tmp; du -sShc .[^.] .??* * | sort -h

Com uma versão mais antiga do tipo

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

EDIT: adicionado parâmetro -S a du para não incluir subdiretórios.

    
por 07.04.2011 / 13:59
0

ATUALIZAÇÃO: cancelei o script anterior. Aqui está uma nova versão, usando du e awk (o anterior usou tree e sed )

Esta é a saída de: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

Aqui está o script

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#
    
por 07.04.2011 / 11:13
0
find /tmp -exec du {} + | sort -nr | less 

mostra os arquivos maiores primeiro, então você pode q uit assim que você tiver visto o suficiente.

    
por 08.04.2011 / 17:33