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.
brew install coreutils
(que anexa todos os comandos coreutils com um 'g'). Você pode então fazergdu -hs * | gsort -h
.du -hs *
funciona bem no Mac OS X, massort -h
retornasort: invalid option -- h
. Também é possível instalar o pacote coreutils via MacPorts, conforme descrito aqui .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:
Novamente, isso arredonda os tamanhos para o MB mais próximo. Você pode modificá-lo convertendo para a unidade de sua escolha.
fonte
du -sm * | sort -n
.-s
/-g
Fazdu
tamanhos de saída em megabytes / gigabytes.int($1 / (1024 * 1024))
Este lida com nomes de arquivos com espaço em branco ou apóstrofos e funciona em sistemas que não suportam
xargs -d
ousort -h
:o que resulta em:
fonte
Aqui está mais um:
Você pode ter que fazer uma
primeiro.
fonte
du -sk * | classificar -n | awk '{print $ 2}' | enquanto lê f; faça du -sh "$ f"; feito
fonte
Este comando classificará por tamanho em MB
fonte
-h
bandeira para du.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#GB
ou#MB
foi a última coluna na saída: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
a
para 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
, useprintf
para 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
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 :)
fonte