Encontre arquivos ou diretórios maiores


10

Qual comando imprimirá os tamanhos de todos os arquivos e diretórios no diretório tmp (incluindo os ocultos) e os classificará por tamanhos do maior para o menor no 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)

Tentei usar os comandos lse, dumas não consegui encontrar as opções corretas.

Respostas:


7

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

du -smc * | sort -n

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

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

Isso pode causar avisos sobre se um ou mais dos padrões acima não correspondem a um arquivo. O primeiro padrão .[^.]corresponde a todos os dois nomes de arquivos de caracteres começando com. exceto para .., o segundo padrão, .??*corresponde aos três nomes de arquivos com três letras ou mais começando com. e * corresponde a todos os arquivos que não estão começando. Para uma listagem mais sofisticada, como encontrar todos os arquivos maiores que X em todo um sistema de arquivos ou manter uma lista de crescimento do sistema de arquivos, tenho um script shell DIY que escrevi e que pode ser compartilhado se você estiver interessado.


Obrigado. Estou interessado no seu roteiro, se você for tão gentil.
— xralf

1
Use sort -nrse você quiser os maiores valores por cima.
— LawrenceC

3

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

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

Para listar os arquivos e as árvores de diretório imediatamente abaixo /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 abaixo /tmp, classificados 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 lista /tmp/dir/file, a segunda lista /tmp/dire a terceira lista os dois.)

Todos os comandos acima mostram tamanhos em kilobytes. Embora o GNU du possa produzir tamanhos “legíveis por humanos” (com multiplicadores k, M, G, etc.), classificá-los é outra questão. Coreutils GNU recentes o suficiente (≥7.4) podem fazer isso: basta substituir du -kpor du -he sort -k1n -k2com sort -k1h -k2. Caso contrário, eis um script bruto do awk para converter em tamanhos com sufixo (arredondamento para baixo); basta canalizar a sortsaída acima para ele.

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}'

Obrigado. Esses comandos são úteis, mas estou interessado apenas nos arquivos e diretórios diretamente sob tmp, não os arquivos em subdiretórios
— xralf

1
@xralf: Em seguida, use apenas a segunda forma de duchamada.
— Gilles 'SO- stop be evil'

Parece bom, mas o melhor resultado é com MB e GB conforme o forcefsck postado.
— xralf

3

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

Ele imprime tamanhos de todos os arquivos e subdiretórios do 1º nível do diretório atual.


É uma solução curta e agradável, mas imprime apenas diretórios.
— Xralf

Oh, desculpe, você está certo. Eu nunca enfrentei esse problema com arquivos. No entanto, descobri como fazê-lo funcionar com arquivos: usando --all swicth.
— RVS

Ótima solução correta. penguin359 tem um pouco melhor porque mostra os tamanhos em MB. O melhor seria a solução do forcefsck, mas sua solução omite os diretórios com espaços.
— xralf

1

Com a versão atual do gnu sort (e padrão de arquivo emprestado @ 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 -Sdu para não incluir subdiretórios.


Eu queria um espaço em disco usado por arquivos e diretórios (tamanho total de dados dentro) diretamente sob tmp (não subdiretórios). Meu comando de classificação não possui a opção -h.
— xralf

Não tenho 100% de certeza do que você quer dizer, pois você já aceitou uma resposta com a mesma seleção de padrão de arquivo. Editou minha postagem para não incluir subdiretórios. Se você deseja o tamanho aparente e não o espaço em disco real usado, você pode adicionar --apparent-sizeaos parâmetros du.
— forcefsck

Agora funciona bem. Eu só tenho que procurar GB e depois MB, mas não é um problema.
— Xralf

Eu tinha as letras da unidade na ordem errada, agora corrigidas. Se você deseja que o pedido seja grande ou pequeno, altere a ordem das letras das unidades e adicione -r para classificar.
— forcefsck

Notei, ele se esqueceu de imprimir o tamanho do diretório (sem prefixo.)
— xralf

0

UPDATE: Eu raspei o script anterior. Aqui está uma nova versão, usando due awk (a anterior usada treee 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."* 
#

Quando você diz o tamanho de todos os arquivos e diretórios , quer dizer o espaço que cada item ocupa no disco (por exemplo, no sistema de arquivos ext4 do Ubuntu , um diretório vazio ocupa 4k de espaço em disco e um arquivo menor que 4k ocupa 4k O pedaço mínimo de atribuição é de 4k) .. ou você quer dizer a quantidade de dados em cada arquivo, por exemplo, 100 (bytes) .. E para diretórios, deseja conhecer o total de dados de arquivo nesse diretório. você quer o tamanho dos dados dentro dos arquivos e treefaz isso. se você quiser o disco-espaço usado, em seguida, dufaz isso ... ( treenão somam um diretório)
— Peter.O

'du' é a melhor escolha ... Acabei de notar man duque ele também pode relatar o "tamanho aparente do arquivo" .... The apparent size of a file is the number of bytes reported by wc -c 'em arquivos regulares ou, geralmente, ls -l --block-size=1' or stat --format =% s '. Por exemplo, um arquivo contendo a palavrazoo' with no newline would, of course, have an apparent size of 3.
— Peter.O 7/11

Eu queria espaço em vez de disco usado por arquivos e diretórios (tamanho total dentro de dados) diretamente sob tmp (não subdiretórios)
— xralf

Sinto muito, mas ainda não estou no estágio de script de shell. Por isso, deixei que outros usuários decidissem o quão boa é a resposta. Obrigado por seu trabalho. Vou estudá-lo quando estiver melhor.
— xralf

0
find /tmp -exec du {} + | sort -nr | less 

mostra os arquivos maiores primeiro, para que você possa qusá-lo assim que tiver visto o suficiente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.