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.

xralf
fonte

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.

penguin359
fonte
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}'
Gilles 'SO- parar de ser mau'
fonte
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.

rvs
fonte
É 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.

forcefsck
fonte
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."* 
#
Peter.O
fonte
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.

Usuário desconhecido
fonte