Classificação de tamanhos de arquivos legíveis por humanos

16

Como posso classificar uma lista usando uma classificação de tamanho de arquivo legível por humanos, classificação numérica que leva em consideração o identificador de tamanho (G, M, K)? Posso classificar a " du -sh" saída por exemplo?

Problema: considere o problema de listar arquivos / pastas e classificá-los por tamanho. Você pode conseguir isso executando:

du -s * | sort -n

Isso lista os arquivos / pastas classificados por seus tamanhos. No entanto, o valor do tamanho impresso está em bytes (ou megabytes ou gigabytes, se você escolher).

Seria desejável poder classificar com base nos valores legíveis por humanos, para que eu possa executar algo análogo ao

du -sh * | <human-readable file sort>

E tem pasta de 1,5 GB aparece após 2,0 milhões.

notnoop
fonte

Respostas:

29

Use GNU coreutils> = 7.5:

du -hs * | classificar -h

(Retirado desta questão de falha no servidor )

Página de manual

Editar: você pode verificar suas versões usando du --versione sort --versionse você estiver usando as versões GNU. Se você estiver usando homebrew, poderá precisar usar gdue gsort.

Jason Axelson
fonte
8
OSX não tem essa opção. Você pode usar o homebrew to brew install coreutils(que anexa todos os comandos coreutils com um 'g'). Você pode então fazer gdu -hs * | gsort -h.
precisa saber é o seguinte
11
Só para esclarecer o argumento de @ dsummersl: du -hs *funciona bem no Mac OS X, mas sort -hretorna sort: invalid option -- h. Também é possível instalar o pacote coreutils via MacPorts, conforme descrito aqui .
jvriesem
3

Se você está preocupado apenas com arquivos maiores que 1 MB, como parece, você pode usar este comando para classificá-los e usar o awk para converter o tamanho em MB:

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

Novamente, isso arredonda os tamanhos para o MB mais próximo. Você pode modificá-lo convertendo para a unidade de sua escolha.

Patrick
fonte
Isso é semelhante a: du -sm * | sort -n. -s/ -gFaz dutamanhos de saída em megabytes / gigabytes.
Notnoop 04/09/09
Para MB, você precisa dividir por 1024 a mais. Assim seráint($1 / (1024 * 1024))
Pratik Khadloya
2

Este lida com nomes de arquivos com espaço em branco ou apóstrofos e funciona em sistemas que não suportam xargs -dou sort -h:

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

o que resulta em:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm
Mark Crossfield
fonte
1

Aqui está mais um:

$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

Você pode ter que fazer uma

$ cpan Number::Bytes::Human

primeiro.

0x89
fonte
1

du -sk * | classificar -n | awk '{print $ 2}' | enquanto lê f; faça du -sh "$ f"; feito


fonte
1

Este comando classificará por tamanho em MB

du --block-size=MiB --max-depth=1 path | sort -n
lukmansh
fonte
Isso já é o que o usuário está fazendo, na verdade, ele / ela simplesmente não deu o exemplo com o MiB, mas mencionou isso. O que ele está procurando é ser capaz de classificar ao usar a -hbandeira para du.
Tonin
0

Acabei aqui porque estava tentando classificar outra coisa que combinava MB e GB na mesma saída e não conseguia controlá-lo.

$NFé usado desde que o padrão #GBou #MBfoi a última coluna na saída:

somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n

Explicação do comando awk:

if ($NF ~ /[0-9\.]+GB/)

se a última coluna corresponder ao padrão regex que contém um dígito ou uma .ou mais vezes, seguido deGB

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

defina a variável apara a parte do dígito de cada linha que corresponda ao mesmo padrão de regex na mesma última coluna ( $NF)

printf "%sMB\n", a*1024} \

após a configuração a, use printfpara formatar a saída como${a*1024}MB

else {print $NF}

caso contrário, basta imprimir a última coluna

sort -n

use classificação numérica na saída


exemplo

echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n

Tenho certeza de que há uma maneira de reutilizar o padrão regex, portanto, só estou executando a correspondência uma vez e substituindo no lugar, mas ainda não sei como fazer isso :)

Jens Bodal
fonte