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.

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.


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.


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

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.


1

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


1

Este comando classificará por tamanho em MB

du --block-size=MiB --max-depth=1 path | sort -n

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 :)

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.